3
votes

I am using maven-bundle-plugin to build a war file as a bundle which I would like to deploy in Felix. Here is the POM file for the same.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
  <groupId>net.java</groupId>
  <artifactId>jvnet-parent</artifactId>
  <version>1</version>
</parent>
<groupId>com.sun.jersey.samples.helloworld-osgi-webapp</groupId>
<artifactId>war-bundle</artifactId>
<version>1.11</version>
<name>Helloworld OSGi WebApp - Jersey Sample WAR</name>
<packaging>war</packaging>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <!--  <scope>provided</scope> -->
    </dependency>
    <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.core</artifactId>
        <version>4.2.0</version>
        <!--  <scope>provided</scope> -->
    </dependency>
    <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.compendium</artifactId>
        <version>4.2.0</version>
        <!--  <scope>provided</scope> -->
    </dependency>
     <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.1</version>
    </dependency>

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-xc</artifactId>
        <version>1.5.5</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
       <groupId>org.apache.felix</groupId>
       <artifactId>org.apache.felix.http.api</artifactId>
       <version>2.0.4</version>
    </dependency>

</dependencies>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <inherited>true</inherited>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <executions>
                <execution>
                    <id>bundle-manifest</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>manifest</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
              <manifestLocation>${project.build.directory}/META-INF</manifestLocation>
              <supportedProjectTypes>
                    <supportedProjectType>bundle</supportedProjectType>
                    <supportedProjectType>war</supportedProjectType>
              </supportedProjectTypes>
              <instructions>
                    <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
                    <Import-Package>com.sun.jersey.api.core,com.sun.jersey.spi.container.servlet,*</Import-Package>
                    <Export-Package>com.sun.jersey.samples.helloworld</Export-Package>
                    <Webapp-Context>jersyweb</Webapp-Context>
                    <Web-ContextPath>jersyweb</Web-ContextPath>
                    <Bundle-Activator>com.sun.jersey.samples.helloworld.WebAppContextListener</Bundle-Activator>
                    <Bundle-ClassPath>WEB-INF/classes</Bundle-ClassPath>
                    <Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
                    <Embed-Transitive>true</Embed-Transitive>
              </instructions>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1-alpha-2</version>
            <configuration>
                <attachClasses>true</attachClasses>
                <archive>
                    <manifestFile>${project.build.directory}/META-INF/MANIFEST.MF</manifestFile>
                    <manifestEntries>
                      <Bundle-ClassPath>WEB-INF/classes</Bundle-ClassPath>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>
                                        org.apache.felix
                                    </groupId>
                                    <artifactId>
                                        maven-bundle-plugin
                                    </artifactId>
                                    <versionRange>
                                        [2.0.1,)
                                    </versionRange>
                                    <goals>
                                        <goal>manifest</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore></ignore>
                                </action>
                            </pluginExecution>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>
                                        org.jvnet.jaxb2.maven2
                                    </groupId>
                                    <artifactId>
                                        maven-jaxb2-plugin
                                    </artifactId>
                                    <versionRange>
                                        [0.8.1,)
                                    </versionRange>
                                    <goals>
                                        <goal>generate</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore></ignore>
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

When I build it using maven install, I can see a logically correct MANIFEST.MF file in the META-INF folder of the war bundle. Here is MANIFEST.MF.

**Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven Bundle Plugin
Built-By: parag.ki
Build-Jdk: 1.6.0_18
Bundle-ClassPath: WEB-INF/classes,servlet-api-2.5.jar,org.osgi.core-4.
 2.0.jar,org.osgi.compendium-4.2.0.jar,jersey-core-1.11.jar,jersey-ser
 ver-1.11.jar,asm-3.1.jar,jettison-1.1.jar,stax-api-1.0.1.jar,jackson-
 core-asl-1.5.5.jar,jackson-mapper-asl-1.5.5.jar,jackson-jaxrs-1.5.5.j
 ar,jackson-xc-1.5.5.jar,org.apache.felix.http.api-2.0.4.jar
Bnd-LastModified: 1333436962460
Bundle-Activator: com.sun.jersey.samples.helloworld.WebAppContextListe
 ner
Bundle-Description: Java.net - The Source for Java Technology Collabor
 ation
Bundle-ManifestVersion: 2
Bundle-Name: Helloworld OSGi WebApp - Jersey Sample WAR
Bundle-SymbolicName: war-bundle
Bundle-Version: 1.11.0
Embed-Dependency: *;scope=compile|runtime;inline=false
Embed-Transitive: true
Embedded-Artifacts: servlet-api-2.5.jar;g="javax.servlet";a="servlet-a
 pi";v="2.5",org.osgi.core-4.2.0.jar;g="org.osgi";a="org.osgi.core";v=
 "4.2.0",org.osgi.compendium-4.2.0.jar;g="org.osgi";a="org.osgi.compen
 dium";v="4.2.0",jersey-core-1.11.jar;g="com.sun.jersey";a="jersey-cor
 e";v="1.11",jersey-server-1.11.jar;g="com.sun.jersey";a="jersey-serve
 r";v="1.11",asm-3.1.jar;g="asm";a="asm";v="3.1",jettison-1.1.jar;g="o
 rg.codehaus.jettison";a="jettison";v="1.1",stax-api-1.0.1.jar;g="stax
 ";a="stax-api";v="1.0.1",jackson-core-asl-1.5.5.jar;g="org.codehaus.j
 ackson";a="jackson-core-asl";v="1.5.5",jackson-mapper-asl-1.5.5.jar;g
 ="org.codehaus.jackson";a="jackson-mapper-asl";v="1.5.5",jackson-jaxr
 s-1.5.5.jar;g="org.codehaus.jackson";a="jackson-jaxrs";v="1.5.5",jack
 son-xc-1.5.5.jar;g="org.codehaus.jackson";a="jackson-xc";v="1.5.5",or
 g.apache.felix.http.api-2.0.4.jar;g="org.apache.felix";a="org.apache.
 felix.http.api";v="2.0.4"
Import-Package: com.sun.jersey.api.core,com.sun.jersey.samples.hellowo
 rld,com.sun.jersey.spi.container.servlet,com.sun.net.httpserver,javax
 .activation,javax.annotation.security,javax.imageio,javax.imageio.spi
 ,javax.imageio.stream,javax.mail,javax.mail.internet,javax.mail.util,
 javax.microedition.io,javax.naming,javax.security.auth.x500,javax.xml
 .bind,javax.xml.bind.annotation,javax.xml.bind.annotation.adapters,ja
 vax.xml.datatype,javax.xml.parsers,javax.xml.transform,javax.xml.tran
 sform.dom,javax.xml.transform.sax,javax.xml.transform.stream,org.joda
 .time,org.joda.time.format,org.w3c.dom,org.w3c.dom.bootstrap,org.w3c.
 dom.ls,org.xml.sax
Tool: Bnd-1.50.0
Web-ContextPath: jersyweb
Webapp-Context: jersyweb**

But when I deploy it in Apache Felix and start it, I see following error.

g! org.osgi.framework.BundleException: Unresolved constraint in bundle war-bundle [5]: Unable to resolve 5.0: missing requirement [5.0] osgi.wiring.package; (osgi.wiring.package=com.sun.jersey.api.core)

Package com.sun.jersey.api.core is part of jersey-core-1.11.jar which is already there mentioned in Bundle-ClassPath in MANIFEST.MF then why do I get this error?

If I start putting respective bundle file like bundle for jersey-core-1.11.jar then issue is resolved but I do not see it as a very good solution. In fact for this purpose only maven bundle plugin provided and tags.

Please advice.

1
I see this question has been unanswered for quite a while, so you've probably moved on anyway. Still, as a tip: Add more tags. You only tagged it as apache-felix, and I (and I suspect many with me) just track OSGi questions, that includes pretty much all Felix questions anyway. Had you done that, you'd have had an answer in two hours instead of two months. For future reference I've added the tag.Frank Lee

1 Answers

4
votes

Having a quick look at the MANIFEST file, I see that there is an import package for com.sun.jersey.api.core. I think you embed this package too, but that has no impact on this dependency. If you ask for a dependency, you'll get it

Simply removing that should work, in maven you can remove it from the Import-Package line.

Also, you do embed an awful lot. I think embedding a servlet api in a webapp isn't a good idea, as the application server supplies that. It might work, but you might run into trouble when deploying to other application servers.