【问题标题】:Jackson Afterburner module is failing inside Apache Karaf 3.0.5Jackson Afterburner 模块在 Apache Karaf 3.0.5 中失败
【发布时间】:2016-05-07 10:23:46
【问题描述】:

我有一个简单的 Hello World 类型的 Karaf Bundle,使用 Jackson's Afterburner ModuleApache ServiceMix 6.1.0 中运行。激活码如下:-

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>

我试图转换为 json 的 java 对象是一个简单的对象,如下所示:-

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

所有必需的 Jackson 包都安装在 Karaf 中:-

karaf@root>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                     
karaf@root>bundle:list | grep jackson
124 | Active    |  50 | 2.6.2                              | jackson-databind  

如果我注释掉以下行,一切正常:-

objectMapper.registerModule(new AfterburnerModule());

谁能告诉我我做错了什么?

所有代码我都放在github.

【问题讨论】:

    标签: jackson apache-karaf jackson-modules apache-servicemix


    【解决方案1】:

    您已经在 karaf 邮件列表中提出过这个问题。 还是一样的,只要包没有导入到你自己的应用程序中就行不通。 由于您为 *;optional=true 进行了导入,因此不会出现接线异常,因为您的导入都是可选的。因此 ClassNotFound 异常。 首先使用

    检查正确导入的标题
    bundle:header [bundle-id]
    

    其次,由于您正在执行 * 导入,因此可能会发生这种情况,因为您没有明确要求某个包中的某个类没有导入某些包。 并且子包导入对包没有帮助,所以如果你有一个

    的导入
    com.fasterxml.jackson.module.afterburner.subPackage
    

    这对解析中的类没有帮助

    com.fasterxml.jackson.module.afterburner
    

    所以实际上最好声明所有导入并仅在子包上使用 *。

    在您的情况下,将以下内容添加到您的 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>
    

    【讨论】:

    • 如果我添加&lt;Import-Package&gt;com.fasterxml.jackson.module.afterburner.*,*;resolution:=optional&lt;/Import-Package&gt;,那么在生成的MANIFEST 中我没有看到com.fasterxml.jackson.module.afterburner 也没有看到Import-Package 中的子包serdeser 但是如果我指定了子包如下所示。我在Import-Package &lt;Import-Package&gt;com.fasterxml.jackson.module.afterburner.ser,com.fasterxml.jackson.module.afterburner.deser,*;resolution:=optional&lt;/Import-Package&gt; 中同时获得了serdeser。你能告诉我这可能是什么原因吗?
    • 被检查的字节码似乎没有使用这些包,因此没有导入。如果通过反射等使用这些包的类,通常会发生这种情况。在这种情况下,自己实际添加这些依赖项至关重要。这些工具只能在一定程度上有所帮助,最终你需要定义你所知道的依赖关系。
    • 我又遇到了一个问题。我已经把它贴在这里karaf.922171.n3.nabble.com/…。你能帮我看看可能出了什么问题吗?
    【解决方案2】:

    随着升级到 Jackson 2.7.4。如下所示修改我在pom.xml 中的 Import-Package 解决了这个问题:-

    &lt;Import-Package&gt;com.fasterxml.jackson.module.afterburner.ser;resolution:=optional,*&lt;/Import-Package&gt;

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      相关资源
      最近更新 更多