我正在尝试使用 maven 创建一个 OSGI 包。我无法正确捆绑 JAR

Posted

技术标签:

【中文标题】我正在尝试使用 maven 创建一个 OSGI 包。我无法正确捆绑 JAR【英文标题】:I am trying to create a OSGI bundle using maven. I am not able to bundle the JARs properly 【发布时间】:2019-07-15 08:59:03 【问题描述】:

我得到以下异常。我正在使用 servicemix 来运行捆绑包。我认为我没有正确导入和导出包,这就是我得到类未找到异常的原因。我的包结构是 com.born.XXXX。请帮助我正确构建捆绑包。

Caused by: java.lang.NoClassDefFoundError: org/apache/camel/Processor
        at java.lang.ClassLoader.defineClass1(Native Method)[:1.8.0_162]
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)[:1.8.0_162]
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.defineClass(BundleWiringImpl.java:2310)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2094)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1518)
        at org.apache.felix.framework.BundleWiringImpl.access$200(BundleWiringImpl.java:79)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1958)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.8.0_162]
        at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1925)[org.apache.felix.framework-5.6.2.jar:]
        at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:978)
        at org.apache.aries.blueprint.container.BlueprintContainerImpl.loadClass(BlueprintContainerImpl.java:467)[28:org.apache.aries.blueprint.core:1.7.1]
        at org.apache.cxf.bus.blueprint.BlueprintBeanLocator.getClassForMetaData(BlueprintBeanLocator.java:73)
        at org.apache.cxf.bus.blueprint.BlueprintBeanLocator.getClassForMetaData(BlueprintBeanLocator.java:82)
        at org.apache.cxf.bus.blueprint.BlueprintBeanLocator.getBeansOfType(BlueprintBeanLocator.java:121)
        at org.apache.cxf.bus.extension.ExtensionManagerBus.initialize(ExtensionManagerBus.java:280)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_162]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_162]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_162]
        at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_162]
        at org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:299)
        at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:980)
        at org.apache.aries.blueprint.container.BeanRecipe.runBeanProcInit(BeanRecipe.java:736)
        ... 28 more
Caused by: java.lang.ClassNotFoundException: org.apache.camel.Processor not found by ProductRouter [222]
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1550)[org.apache.felix.framework-5.6.2.jar:]
        at org.apache.felix.framework.BundleWiringImpl.access$200(BundleWiringImpl.java:79)[org.apache.felix.framework-5.6.2.jar:]
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1958)[org.apache.felix.framework-5.6.2.jar:]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.8.0_162]
        ... 50 more  

这是我的 pom.xml 文件。 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>oktopus-integration</artifactId>
        <groupId>com.born</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <groupId>com.born</groupId>
    <artifactId>ProductRouter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>bundle</packaging>

    <name>ProductRouter Blueprint Bundle</name>
    <description>ProductRouter OSGi blueprint bundle project.</description>

<dependencies>
        <dependency>
            <groupId>com.born</groupId>
            <artifactId>oktopus-common</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <!-- <scope>provided</scope> -->
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-blueprint</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.camel/camel-cxf -->
    <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cxf</artifactId>
    <version>2.23.1</version>
    </dependency>
<dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jackson</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>   
        <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16 -->
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk16</artifactId>
        <version>1.45</version>
    </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-ws-security</artifactId>
        </dependency>
                        <!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20160212</version>
</dependency>





    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
    </dependency>

    <dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-bundle-jaxrs -->
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-bundle-jaxrs</artifactId>
    <version>2.6.0</version>
</dependency>


    </dependencies>


    <build>
        <plugins>
             <!--  ERP JAXB creation services -->
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.14.0</version>
                <executions>
                    <execution>
                        <id>Netsuite services</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <wsdl>true</wsdl>
                            <xmlschema>false</xmlschema>
                            <schemaDirectory>src/main/resources/wsdl</schemaDirectory>
                            <schemaIncludes>
                                <include>*.wsdl</include>
                            </schemaIncludes>
                            <bindingDirectory>src/main/resources/wsdl</bindingDirectory>
                            <bindingIncludes>
                                <include>edu.xjb</include>
                            </bindingIncludes>
                            <schemaLanguage>WSDL</schemaLanguage>
                            <generatePackage>com.born.netsuite.stub</generatePackage>
                            <forceRegenerate>true</forceRegenerate>
                            <generateDirectory>gensrc</generateDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>   
           <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>

                <extensions>true</extensions>
                <configuration>
                    <instructions>

                        <Bundle-SymbolicName>$project.artifactId</Bundle-SymbolicName>
                        <Bundle-Version>$project.version</Bundle-Version>
                        <Export-Package>"!com.born,*";version=$project.version</Export-Package>

                        <Import-Package> "!com.born,*"</Import-Package>
                        <!-- <Embed-Dependency>*;scope= *</Embed-Dependency> -->
                         <Embed-Dependency>oktopus-integration,commons-lang,jaxws-api,json</Embed-Dependency>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

下面是我的 MANIFEST.IMF 文件。

Manifest-Version: 1.0
Bnd-LastModified: 1550813093689
Build-Jdk: 1.8.0_162
Built-By: Vishal.jagdale
Bundle-Blueprint: OSGI-INF/blueprint/productDataRouter.xml
Bundle-ClassPath: .,json-20160212.jar
Bundle-Description: ProductRouter OSGi blueprint bundle project.
Bundle-ManifestVersion: 2
Bundle-Name: ProductRouter Blueprint Bundle
Bundle-SymbolicName: ProductRouter
Bundle-Version: 1.0.0.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: oktopus-integration,commons-lang,jaxws-api,json
Embedded-Artifacts: json-20160212.jar;g="org.json";a="json";v="2016021
 2"
Export-Package: com.born.netsuite.stub;version="1.0.0.SNAPSHOT";uses:=
 "javax.xml.bind.annotation,javax.xml.datatype",com.born.oktopus.commo
 n.data;version="1.0.0.SNAPSHOT";uses:="javax.xml.bind.annotation",com
 .born.oktopus.esb.common;version="1.0.0.SNAPSHOT",com.born.oktopus.es
 b.common.processor;version="1.0.0.SNAPSHOT";uses:="org.apache.camel",
 com.born.oktopus.esb.data;version="1.0.0.SNAPSHOT";uses:="org.apache.
 camel.dataformat.bindy.annotation",com.born.oktopus.product.client;ve
 rsion="1.0.0.SNAPSHOT";uses:="javax.security.auth.callback",com.born.
 oktopus.product.controller;version="1.0.0.SNAPSHOT";uses:="javax.ws.r
 s",com.born.oktopus.product.processor;version="1.0.0.SNAPSHOT";uses:=
 "org.apache.camel",com.born.oktopus.product.routes;version="1.0.0.SNA
 PSHOT";uses:="org.apache.camel.builder",com.born.oktopus.rest;version
 ="1.0.0.SNAPSHOT";uses:="javax.xml.bind.annotation",com.born.oktopus.
 wsdl.data;version="1.0.0.SNAPSHOT";uses:="javax.xml.bind.annotation,j
 avax.xml.datatype"
Import-Package: javax.security.auth.callback,
 javax.ws.rs;version="[2.0,3)",javax.xml.bind.annotation;version="[2.2
 ,3)",javax.xml.datatype,org.apache.camel;version="[2.16,3)",org.apach
 e.camel.builder;version="[2.16,3)",org.apache.camel.dataformat.bindy.
 annotation;version="[2.16,3)",org.apache.camel.model;version="[2.16,3
 )",org.apache.camel.spi;version="[2.16,3)",org.apache.cxf.interceptor
 ;version="[3.1,4)",org.apache.cxf.jaxrs.provider;version="[3.1,4)",or
 g.apache.cxf.ws.security.wss4j;version="[3.1,4)",org.apache.wss4j.com
 mon.ext;version="[2.1,3)",org.osgi.service.blueprint;version="[1.0.0,
 2.0.0)"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Tool: Bnd-4.1.0.201810181252

【问题讨论】:

你能添加你的 Manifest.MF @MartinBaumgartner 添加了文件。 问题似乎 cxf 无法访问 camel-bundle,不容易解决....你能在 github 上提供一个完整的例子吗? 【参考方案1】:

当我需要将 JAR 转换为我使用的 Servicemix 中的捆绑包时:

./bin/servicemix

osgi:install -s wrap:file:////"jar_location Ex: /lib/ojdbc6-13.jar"

执行关机命令,选择yes选项。

【讨论】:

以上是关于我正在尝试使用 maven 创建一个 OSGI 包。我无法正确捆绑 JAR的主要内容,如果未能解决你的问题,请参考以下文章

带有 maven-bundle-plugin 的 OSGI JAR 包

如何使用 Maven 将第 3 方 OSGi 捆绑包添加到部署包中?

使用 maven-bundle-plugin 安装 OSGi 依赖项

无法启动 OSGi 包,缺少 com.ibm.uvm.tools

如何使用 maven 项目轻松部署到 Karaf Osgi 容器

使用 Maven、OSGi 和 Bndtools