Reputation: 1200
I'm trying to create a bundle using maven-bundle-plugin. The pom.xml of the project is:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.adobe.support.examples</groupId>
<artifactId>com.adobe.support.examples.osgi.service</artifactId>
<version>1.0.8</version>
<packaging>bundle</packaging>
<name>OSGi Service Example</name>
<url>http://blogs.adobe.com/kmossman</url>
<description>Adobe Developer Support OSGi Service Example</description>
<!--
Credit: This example is based on Moritz Havelock's http://in-the-sling.blogspot.com/
I suggest you use the most current versions of the plugin's.
Search the Central Repository for the most current versions http://search.maven.org/
Use the search strings below and update the appropriate versions
// Felix
g:"org.apache.felix" a:"org.apache.felix.framework"
g:"org.apache.felix" a:"maven-bundle-plugin"
g:"org.apache.felix" a:"maven-scr-plugin"
g:"org.apache.felix" a:"org.osgi.core"
// Maven
g:"org.apache.maven.plugins" a:"maven-compiler-plugin"
// Sling
g:"org.apache.sling" a:"maven-sling-plugin"
-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.java.version>1.6</project.build.java.version>
<!-- Felix -->
<org.apache.felix.framework.version>4.0.2</org.apache.felix.framework.version>
<org.apache.felix.maven-bundle-plugin.version>2.3.7</org.apache.felix.maven-bundle-plugin.version>
<org.apache.felix.maven-src-plugin.version>1.7.4</org.apache.felix.maven-src-plugin.version>
<org.apache.felix.org.osgi.core>1.4.0</org.apache.felix.org.osgi.core>
<!-- Maven -->
<org.apache.maven.plugins.maven-compiler-plugin.version>2.3.2</org.apache.maven.plugins.maven-compiler-plugin.version>
<org.apache.maven.plugins.maven-surefire-plugin.version>2.12</org.apache.maven.plugins.maven-surefire-plugin.version>
<!-- Sling -->
<org.apache.sling.maven-sling-plugin.version>2.1.0</org.apache.sling.maven-sling-plugin.version>
</properties>
<build>
<plugins>
<!-- Maven will compile our source java classes using
the "project.build.java.version" specified -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${org.apache.maven.plugins.maven-compiler-plugin.version}</version>
<configuration>
<source>${project.build.java.version}</source>
<target>${project.build.java.version}</target>
</configuration>
</plugin>
<!-- this will install the OSGi bundle into Sling for us
we now upload the jar file automatically when we build with this plug-in -->
<plugin>
<groupId>org.apache.sling</groupId>
<artifactId>maven-sling-plugin</artifactId>
<version>${org.apache.sling.maven-sling-plugin.version}</version>
<executions>
<execution>
<id>install-bundle</id>
<goals>
<goal>install</goal>
</goals>
<configuration>
<slingUrl>http://localhost:4502/system/console/install</slingUrl>
<user>admin</user>
<password>admin</password>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<!-- This will create the OSGI-INF for us that handles the Activator Class for us
we now auto-generate the details in our bundle with this plug-in-->
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
<extensions>true</extensions>
<version>${org.apache.felix.maven-src-plugin.version}</version>
<executions>
<execution>
<id>generate-scr-scrdescriptor</id>
<goals>
<goal>scr</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<!-- This will create the OSGi /META-INF/MANIFEST.MF for us
we now auto-generated the filea for us with this plug-in -->
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<version>${org.apache.felix.maven-bundle-plugin.version}</version>
<configuration>
<instructions>
<Export-Package>com.adobe.support.examples.osgi.service</Export-Package>
<Import-Package>org.osgi.framework;version="1.3.0"</Import-Package>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${project.name}</Bundle-Name>
<Bundle-Vendor>Kurt Mossman</Bundle-Vendor>
<!--
Inserting content into the JCR and installing some files on the server with your bundle.
Sling-Initial-Content
The first line will overwrite the contents of the node at content/osgitest with test.json
NOTE: uninstall:=false says that it will not remove the content when I remove the package.
This could be set to true to also remove the content when the package is removed the choice is yours.
The second line will overwrite the path will install the files and overwrite them if you re-install.
-->
<Sling-Initial-Content>
SLING-INF/initial-content/content/osgitest;path:=/content/osgitest;overwrite:=true;uninstall:=false,
SLING-INF/initial-content/apps/samples/osgitest;path:=/apps/samples/osgitest;overwrite:=true;uninstall:=true
</Sling-Initial-Content>
</instructions>
</configuration>
</plugin>
<!-- use the surefire plugin to run the test cases
we use a thread count of 4 to increase the performance of the test time. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${org.apache.maven.plugins.maven-surefire-plugin.version}</version>
<configuration>
<parallel>methods</parallel>
<threadCount>4</threadCount>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.core</artifactId>
<version>${org.apache.felix.org.osgi.core}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.annotations</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.compendium</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
</project>
I am getting the below error when I run mvn install command.
"Unresolved references to [org.osgi.service.component] by class(es) on the Bundle-Classpath[Jar:dot]: [com/adobe/support/examples/com/adobe/support/examples/osgi/service/SampleServiceImpl.class]"
Could you please help me to fix it?
Regards, Anderson
Upvotes: 1
Views: 5416
Reputation: 15372
The problem is that you're not having a mental model of what your app is doing and how that should be handled on OSGi ... So let me try to explain.
The message indicates that your SampleServiceImpl
class uses a class in the package org.osgi.service.component
. When bnd, the plugin in maven that makes the OSGi manifest, analyzes your code it creates a reference to that package, this is in preparation for import. bnd then looks for an instruction Import-Package
. This is by default *
(wildcard), meaning it should import ALL references. However, in your POM you override this instruction with org.osgi.framework;version="1.3.0
. Since this package does not match the org.osgi.service.component
package, bnd ignores this reference. I.e. the Import-Package instruction is intended to decorate the imports (version, optional, attributes, directives, etc.) but should in general not be touched since bnd is really good in doing this decorating itself based on the classpath.
However, after bnd has built the jar it runs an independent verifier to check that what it did was ok. This verifier then sees a reference to a class that is not imported and reports it as an error, which is correct. A bundle that has a class with a reference to another class that is neither imported nor contained is bound to cause a Class Not Found Exception during runtime.
So, as so many things in bnd, the solution is simple: just remove the Import-Package header and let bnd do its work, its defaults are usually the best solution, especially if you have no clue yet. Only when you get an import in your manifest that is not desired you should use this header.
Now, your life would be sooooo much simpler if you would use bnd(tools) ...
Upvotes: 5