2015-05-27 7 views
19

Ich kann ein Paket in Karaf (Version 3.0.1) nicht starten.Karaf/Maven - Kann nicht aufgelöst werden: fehlende Anforderung osgi.wiring.package

Das Paket wird mit Maven erstellt und importiert gson.

I enthalten Gson in Maven nach Bedarf:

<dependency> 
    <groupId>com.google.code.gson</groupId> 
    <artifactId>gson</artifactId> 
    <version>2.3.1</version> 
</dependency> 

Der Build geht in Ordnung. Bei der Bereitstellung des Bundles erhalte ich jedoch diese Warnung von 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] 

Das Bundle ist nicht installiert.

Die Import-Package im MANIFEST.MF beginnt mit:

Import-Package: com.google.gson;version="[2.3,3)" 

Ich habe versucht, es zu ändern mit:

Import-Package: com.google.code.gson;version="[2.3,3)" 

Aber es gibt mir einen ähnlichen Fehler:

missing requirement [121.13] osgi.wiring.package; (&(osgi.wiring.package=com.google.code.gson) 

Die 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> 

Die MANIFEST.MF von Google Gson (die Version Maven-Downloads, wenn ich das Bündel Build):

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 

ich auch versucht, mit

<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> 

Jetzt sind die Abhängigkeiten eingebettet sind aber Karaf kann nicht starte das Bündel.

+0

Sie die Diskrepanz bewusst sind, in Paketen zwischen ' com.google.code.gson' und 'osgi.wiring.package = com.google.gson'? – javabrett

+0

Ja, danke. Ich suchte nach dem Paket 'com.google.gson', aber afaik gibt es nur' com.google.code.gson'. Ich weiß jedoch nicht, warum das erforderliche Paket 'com.google.gson' ist. Irgendwelche Anhaltspunkte? – gc5

+0

Sieht aus wie es in Ordnung sein sollte. Kannst du deine Bundle-Konfiguration von yout POM, 'Import-Package' etc. posten? – javabrett

Antwort

27

Ich glaube, Sie haben zwei Möglichkeiten hier.

Wenn Sie in Ihrem MANIFEST.MF haben, bedeutet dies, dass Sie möchten, dass ein Paket aus einem bereitgestellten Bundle und nicht aus einem eingebetteten Jar importiert wird. In diesem Fall sollten Sie zunächst das Paket gson-2.3.1.jar bereitstellen (diese Datei in den Bereitstellungsordner kopieren) und dann das Bundle bereitstellen.

Wenn Sie die Gson Bibliothek als einfache nicht-OSGi jar Abhängigkeit einbetten möchten, kann dies auch getan werden, aber dann muss man seine Pakete von Import-Package auszuschließen:

<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> 
+0

Super, ich habe die zweite Lösung benutzt. Danke – gc5

+0

Die Embed-Dependecy-Lösung löste ein ähnliches Problem mit org.apache.derby.jdbc. Vielen Dank! – Cesar

+2

Ich denke, es sollte einige Änderungen des Tags geben, ich habe es selbst getestet. !google.gson, *, andernfalls wird com.google.gson nicht ausgeschlossen. –