代码之家  ›  专栏  ›  技术社区  ›  tuk

Apache Karaf 3.0.5中的Jackson Afterburner模块出现故障

  •  1
  • tuk  · 技术社区  · 9 年前

    我有一个简单的Hello World类型的Karaf Bundle在里面运行 Apache ServiceMix 6.1.0 使用 Jackson's Afterburner Module 。激活器代码如下所示:-

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

    2 回复  |  直到 9 年前
        1
  •  4
  •   Achim Nierbeck    9 年前

    你已经在卡拉夫邮件列表中问过这个问题。 这仍然是一样的,只要包没有导入到您自己的应用程序中,它就不会工作。 因为您为*;执行了导入;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>
    
        2
  •  -1
  •   tuk    9 年前

    随着升级到Jackson 2.7.4。在中修改我的导入包 pom.xml 如下图所示,解决了问题:-

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

    推荐文章