2016-05-07 3 views
0

У меня есть простой Hello World тип Karaf Bundle, работающий внутри Apache ServiceMix 6.1.0 с использованием Jackson's Afterburner Module. Код активатора выглядит следующим образом: -Модуль Jackson Afterburner не работает внутри 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 "";   
     }    
} 

pom.xml выглядит следующим образом: -

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

объект Java, который я пытаюсь преобразовать JSON простой объект, как показано ниже: -

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

Но всякий раз, когда я пытаюсь установить пакет я получаю ниже исключение и расслоение застревает в Resolved состоянии: -

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 

Все необходимые пакеты Джексон установлены в Karaf: -

[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 

Все отлично работает, если я закомментировать строку ниже: -

objectMapper.registerModule(new AfterburnerModule()); 

Может кто-нибудь, дайте мне знать что я делаю неправильно?

Весь код, который я разместил в github.

ответ

-1

Наряду с обновлением Джексона 2.7.4. Изменение моего Импорт-пакета в pom.xml, как показано ниже решается вопрос: -.

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

3

Вы уже спрашивали об этом в списке рассылки karaf. Это все та же вещь, если пакет не импортирован в ваше собственное приложение, это не сработает. Поскольку вы импортируете для *; optional = true, вы не получите исключение для проводки, так как ваши импортные товары являются необязательными. Поэтому ClassNotFound Exeception. Прежде всего, проверьте заголовки для правого импорта с

bundle:header [bundle-id] 

секундой, так как вы делаете * импорт может случиться так, как вы явно не попросить определенный класс в определенном пакете, что некоторые пакеты Арен импортировано. А импорт суб-пакет не помогает на упаковке, поэтому если у вас есть импорт для

com.fasterxml.jackson.module.afterburner.subPackage 

это не поможет на разрешающих классов в

com.fasterxml.jackson.module.afterburner 

Так что на самом деле лучше всего объявить весь импорт и использовать * только на подпакетах.

В вашем случае добавьте следующие строки в ПОМ:

 <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

Если добавить ' com.fasterxml.jackson.module.afterburner *, *, разрешение: = необязательный ', то в сгенерированном' MANIFEST' я не видел 'com.fasterxml.jackson.module.afterburner' или подпакет' ser' или 'deser' в' Import-Package', но если я укажите подпакет явно, как показано ниже.Я получал «ser' &' deser »в« Import-Package »' com.fasterxml.jackson.module.afterburner.ser, com.fasterxml.jackson.module.afterburner.deser, * ; разрешение: = опция '. Можете ли вы сообщить мне, что может быть причиной этого? – tuk

+2

Проверенный байт-код, похоже, не использует эти пакеты, поэтому не импортируется. Обычно это происходит, если классы этих пакетов используются через Reflection или такие. В таких случаях очень важно фактически добавлять эти зависимости самостоятельно. Инструменты могут только помочь в определенной степени, в конце вам нужно определить зависимости, о которых вы знаете. –

+0

У меня снова возникает проблема. Я разместил его здесь http://karaf.922171.n3.nabble.com/Jackson-Module-Afterburner-not-working-in-Karaf-3-0-5-td4046536.html#a4046579. Можете ли вы, пожалуйста, помочь мне, что может пойти не так? – tuk