2016-05-07 13 views
0

Ich habe eine einfache Hello World Art Karaf-Bundle innerhalb Apache ServiceMix 6.1.0 mit Jackson's Afterburner Module läuft. Der Aktivator Code sieht wie folgt: -Jackson Afterburner-Modul schlägt in Apache Karaf 3.0.5

public class HelloWorldActivator implements BundleActivator { 
     @Override 
     public void start(BundleContext bundleContext) throws Exception { 
      System.out.println("STARTING DEMO: hello, world\n"); 
      System.out.println(getJsonDataAsString()); 
     } 

     @Override 
     public void stop(BundleContext bundleContext) throws Exception { 
      System.out.println("STOPPING DEMO"); 
     } 

     private String getJsonDataAsString() { 
      JsonDataBlob jsonDataBlob = new JsonDataBlob(); 
      ObjectMapper objectMapper = new ObjectMapper(); 
      objectMapper.registerModule(new AfterburnerModule()); 
      try { 
       return objectMapper.writeValueAsString(jsonDataBlob); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
      return "";   
     }    
} 

Die pom.xml wie unten aussieht: -

<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> 
    <groupId>com.hello</groupId> 
    <artifactId>world</artifactId> 
    <version>0.0.1</version> 
    <packaging>bundle</packaging> 
    <name>Hello World</name> 
    <dependencies> 
     <!-- OSGi --> 
     <dependency> 
      <groupId>org.osgi</groupId> 
      <artifactId>org.osgi.core</artifactId> 
      <version>4.3.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.osgi</groupId> 
      <artifactId>org.osgi.compendium</artifactId> 
      <version>4.3.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.json</groupId> 
      <artifactId>json</artifactId> 
      <version>20160212</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.6.2</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      <version>2.6.2</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>2.6.2</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.module</groupId> 
      <artifactId>jackson-module-afterburner</artifactId> 
      <version>2.7.1</version> 
     </dependency> 



    </dependencies> 
    <build> 
     <sourceDirectory>src</sourceDirectory> 
     <plugins> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
        <excludes> 
         <exclude>**/com/hello/main/*</exclude> 
        </excludes> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <version>2.4.0</version> 
       <inherited>true</inherited> 
       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
         <Bundle-Version>${project.version}</Bundle-Version> 
         <Bundle-Activator>com.hello.world.HelloWorldActivator</Bundle-Activator> 
         <Import-Package>*;resolution:=optional</Import-Package> 
        </instructions> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Das Java-Objekt, das ich json zu konvertieren Ich versuche ein einfaches Objekt wie folgt: -

package com.hello.world; 

public class JsonDataBlob { 
    private String add1 = "JP Naagar"; 
    private String add2 = ""; 
    private int shippartagent = 1; 

    public String getAdd1() { 
     return add1; 
    } 

    public void setAdd1(String add1) { 
     this.add1 = add1; 
    } 

    public String getAdd2() { 
     return add2; 
    } 

    public void setAdd2(String add2) { 
     this.add2 = add2; 
    } 

    public int getShippartagent() { 
     return shippartagent; 
    } 

    public void setShippartagent(int shippartagent) { 
     this.shippartagent = shippartagent; 
    } 
} 

Aber immer, wenn ich versuche, das Bündel installiere ich die unten Ausnahme bin immer und das Bündel wird im Resolved Zustand stecken: -

2016-05-07 15:36:48,986 | WARN | x-6.1-2.0/deploy | fileinstall      | 7 - org.apache.felix.fileinstall - 3.5.0 | Error while starting bundle: file:/Users/debraj/Downloads/apache-servicemix-6.1-2.0/deploy/world-0.0.1.jar 
org.osgi.framework.BundleException: Activator start error in bundle world [239]. 
     at org.apache.felix.framework.Felix.activateBundle(Felix.java:2196)[org.apache.felix.framework-4.2.1.jar:] 
     at org.apache.felix.framework.Felix.startBundle(Felix.java:2064)[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:1245)[7:org.apache.felix.fileinstall:3.5.0] 
     at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1217)[7:org.apache.felix.fileinstall:3.5.0] 
     at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:509)[7:org.apache.felix.fileinstall:3.5.0] 
     at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:358)[7:org.apache.felix.fileinstall:3.5.0] 
     at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:310)[7:org.apache.felix.fileinstall:3.5.0] 
Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/afterburner/AfterburnerModule 
     at java.lang.Class.getDeclaredConstructors0(Native Method)[:1.8.0_77] 
     at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)[:1.8.0_77] 
     at java.lang.Class.getConstructor0(Class.java:3075)[:1.8.0_77] 
     at java.lang.Class.newInstance(Class.java:412)[:1.8.0_77] 
     at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4336) 
     at org.apache.felix.framework.Felix.activateBundle(Felix.java:2141) 
     ... 7 more 
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.module.afterburner.AfterburnerModule not found by world [239] 
     at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)[org.apache.felix.framework-4.2.1.jar:] 
     at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)[org.apache.felix.framework-4.2.1.jar:] 
     at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.8.0_77] 
     ... 13 more 

Alle erforderlichen Jackson Bündel in Karaf installiert sind: -

[email protected]>bundle:list | grep Jackson 
123 | Active | 50 | 2.6.2        | Jackson-core         
125 | Active | 50 | 2.6.2        | Jackson-annotations        
238 | Installed | 80 | 2.7.1        | Jackson-module-Afterburner      
[email protected]>bundle:list | grep jackson 
124 | Active | 50 | 2.6.2        | jackson-databind 

Alles funktioniert gut, wenn ich die folgenden Zeile aus kommentieren: -

objectMapper.registerModule(new AfterburnerModule()); 

Kann mir jemand mitteilen, was mache ich falsch?

Der ganze Code, den ich in der github platziert habe.

Antwort

-1

Zusammen mit Upgrade auf Jackson 2.7.4. Ändern mein Import-Package in pom.xml wie unten das Problem gelöst gezeigt: -.

<Import-Package>com.fasterxml.jackson.module.afterburner.ser;resolution:=optional,*</Import-Package>

3

Sie haben dies bereits in der Karaf-Mailing-Liste gefragt. Es ist immer noch die gleiche Sache, solange das Paket nicht in Ihrer eigenen Anwendung importiert wird, wird es nicht funktionieren. Da Sie einen Import für *; optional = true durchführen, erhalten Sie keine Verdrahtungsausnahme, da Ihre Importe optional sind. Daher die ClassNotFound Execution. Prüfen Sie zuerst die Header für die richtigen Einfuhren mit

bundle:header [bundle-id] 

Sekunde, da Sie eine * Import tun könnte es passieren, da Sie nicht explizit für eine bestimmte Klasse in einem bestimmten Paket fragen Sie, dass einige Pakete aren nicht importiert. Und ein Unterpaket Import auf der Verpackung nicht hilft, wenn Sie also für einen Import haben es eigentlich am besten

com.fasterxml.jackson.module.afterburner.subPackage 

dies nicht so in

com.fasterxml.jackson.module.afterburner 

auf die Lösung Klassen wird dazu beitragen, deklariere alle Importe und verwende das * nur für Unterpakete.

In Ihrem Fall fügen Sie folgendes zu Ihrem pom:

 <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-bundle-plugin</artifactId> 
      <version>2.4.0</version> 
      <inherited>true</inherited> 
      <extensions>true</extensions> 
      <configuration> 
       <instructions> 
        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
        <Bundle-Version>${project.version}</Bundle-Version> 
        <Bundle-Activator>com.hello.world.HelloWorldActivator</Bundle-Activator> 
        <Import-Package> 
         com.fasterxml.jackson.module.afterburner.*, 
         *;resolution:=optional 
        </Import-Package> 
       </instructions> 
      </configuration> 
     </plugin> 
+0

Wenn ich hinzufügen ' com.fasterxml.jackson.module.afterburner *, *, Auflösung: = optional 'dann habe ich im generierten' MANIFEST' weder 'com.fasterxml.jackson.module.afterburner' noch das Unterpaket' ser' oder 'deser' im' Import-Package' gesehen. Aber wenn ich Spezifizieren Sie das Unterpaket explizit wie unten gezeigt.Ich bekam sowohl den 'ser' als auch' deser' im 'Import-Paket'' com.fasterxml.jackson.module.afterburner.ser, com.fasterxml.jackson.module.afterburner.deser, * ; resolution: = optional '. Kannst du mich wissen lassen, was der Grund dafür sein könnte? – tuk

+2

Der inspizierte Bytecode scheint diese Pakete nicht zu verwenden und wird daher nicht importiert. Dies tritt normalerweise auf, wenn Klassen dieser Pakete über Reflection oder dergleichen verwendet werden. In solchen Fällen ist es wichtig, diese Abhängigkeiten selbst hinzuzufügen. Die Tools können nur bis zu einem gewissen Grad helfen, am Ende müssen Sie die Abhängigkeiten definieren, die Sie kennen. –

+0

Ich habe wieder ein Problem. Ich habe es hier http://karaf.922171.n3.nabble.com/Jackson-Module-Afterburner-not-working-in-Karaf-3-0-5-td4046536.html#a4046579 geschrieben. Kannst du mir bitte helfen, was könnte schief gehen? – tuk