I am unable to start a bundle in Karaf (version 3.0.1).
The bundle is built using maven and it imports gson.
I included gson in maven as required:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.3.1</version> </dependency>
The build goes fine. However, when deploying the bundle I receive this Warning from Karaf:
2015-05-27 12:45:07,371 | WARN | 49-19-bin/deploy | fileinstall | 11 - org.apache.felix.fileinstall - 3.2.8 | Error while starting bundle: file:/Users/user/Documents/tools/MyBundle-1.0.0-SNAPSHOT.jar org.osgi.framework.BundleException: Unresolved constraint in bundle MyBundle [121]: Unable to resolve 121.13: missing requirement [121.13] osgi.wiring.package; (&(osgi.wiring.package=com.google.gson)(version>=2.3.0)(!(version>=3.0.0))) at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)[org.apache.felix.framework-4.2.1.jar:] at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)[org.apache.felix.framework-4.2.1.jar:] at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)[org.apache.felix.framework-4.2.1.jar:] at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1263)[11:org.apache.felix.fileinstall:3.2.8] at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1235)[11:org.apache.felix.fileinstall:3.2.8] at org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.java:1224)[11:org.apache.felix.fileinstall:3.2.8] at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:519)[11:org.apache.felix.fileinstall:3.2.8] at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:308)[11:org.apache.felix.fileinstall:3.2.8]
The bundle is not installed.
The Import-Package
in the MANIFEST.MF
begins with:
Import-Package: com.google.gson;version="[2.3,3)"
I tried to change it with:
Import-Package: com.google.code.gson;version="[2.3,3)"
But it gives me a similar error:
missing requirement [121.13] osgi.wiring.package; (&(osgi.wiring.package=com.google.code.gson)
The pom.xml
:
<?xml version="1.0" encoding="UTF-8"?> <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>groupid</groupId> <artifactId>artifactid</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>groupid</groupId> <artifactId>MyBundle</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>bundle</packaging> <name>MyBundle</name> <description>MyBundle</description> <properties> <skipTests>true</skipTests> </properties> <dependencies> ... <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.http.jetty</artifactId> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>com.springsource.org.json</artifactId> </dependency> <dependency> <groupId>org.apache.servicemix.bundles</groupId> <artifactId>org.apache.servicemix.bundles.commons-httpclient</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.4-1201-jdbc41</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> </instructions> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>${skipTests}</skipTests> </configuration> </plugin> </plugins> </build> </project>
The MANIFEST.MF
of Google GSON (the version maven downloads when I build the bundle) is:
Manifest-Version: 1.0 Export-Package: com.google.gson;version=2.3.1, com.google.gson.annotat ions;version=2.3.1, com.google.gson.reflect;version=2.3.1, com.google .gson.stream;version=2.3.1, com.google.gson.internal;version=2.3.1, c om.google.gson.internal.bind;version=2.3.1 Bundle-ClassPath: . Built-By: inder Bundle-Name: Gson Created-By: Apache Maven 3.2.1 Bundle-RequiredExecutionEnvironment: J2SE-1.5, JavaSE-1.6, JavaSE-1.7, JavaSE-1.8 Bundle-Vendor: Google Gson Project Bundle-ContactAddress: http://code.google.com/p/google-gson/ Build-Jdk: 1.6.0_65 Bundle-Version: 2.3.1 Bundle-ManifestVersion: 2 Bundle-Description: Google Gson library Bundle-SymbolicName: com.google.gson Archiver-Version: Plexus Archiver
I also tried with
<build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> <Import-Package>*;resolution:=optional</Import-Package> <Embed-Dependency>*</Embed-Dependency> <Embed-Transitive>true</Embed-Transitive> </instructions> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>${skipTests}</skipTests> </configuration> </plugin> </plugins> </build>
Now the dependencies are embedded but Karaf cannot start the bundle.
I believe you have two options here.
If you have Import-Package: com.google.gson;version="[2.3,3)"
in your MANIFEST.MF
, this means that you want some package to be imported from a deployed bundle, not from an embedded jar. In this case, you should first deploy gson-2.3.1.jar
bundle (copy this file to the deploy folder), and then deploy your bundle.
If you want to embed the gson library as a simple non-OSGi jar dependency, this also can be done, but then you have to exclude its packages from Import-Package
:
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> <Import-Package>!com.google.gson,*</Import-Package> <Embed-Dependency>gson</Embed-Dependency> </instructions> </configuration> </plugin>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With