【问题标题】:bnd-export-maven-plugin questionsbnd-export-maven-plugin 问题
【发布时间】:2020-05-11 22:51:01
【问题描述】:

我正在使用 bnd-export-maven-plugin 生成一个可运行的 jar,其中 pom.xml 定义如下:

<build>
    <sourceDirectory>src</sourceDirectory>
    <testSourceDirectory>test</testSourceDirectory>
    <testResources>
        <testResource>
            <directory>test</directory>
            <excludes>
                <exclude>**/*.java</exclude>
            </excludes>
        </testResource>
    </testResources>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-plugin-version}</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>biz.aQute.bnd</groupId>
            <artifactId>bnd-maven-plugin</artifactId>
            <version>${bnd-maven-plugin-version}</version>
            <executions>
                <execution>
                    <id>default-bnd-process</id>
                    <goals>
                        <goal>bnd-process</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>biz.aQute.bnd</groupId>
            <artifactId>bnd-export-maven-plugin</artifactId>
            <version>${bnd-maven-plugin-version}</version>
            <configuration>
                <failOnChanges>false</failOnChanges>
                <bndruns>
                    <bndrun>com.xyz.masterdata.application.services.bndrun</bndrun>
                </bndruns>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>export</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>osgi.annotation</artifactId>
        <version>7.0.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.service.jaxrs</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.service.component.annotations</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.service.http.whiteboard</artifactId>
        <version>1.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.framework</artifactId>
        <version>6.0.3</version>
    </dependency>
    <dependency>
        <groupId>io.swagger.core.v3</groupId>
        <artifactId>swagger-jaxrs2</artifactId>
        <version>${swagger-maven-plugin-version}</version>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>${javax.ws.rs-api-version}</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>${javax.servlet-api-version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.25</version>
    </dependency>
    <dependency>
        <groupId>org.ops4j.pax.jdbc</groupId>
        <artifactId>pax-jdbc-mysql</artifactId>
        <version>1.3.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <dependency>
        <groupId>com.xyz.foundation</groupId>
        <artifactId>com.xyz.foundation.common.provider</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.xyz.foundation</groupId>
        <artifactId>com.xyz.foundation.common.provider</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.xyz.foundation</groupId>
        <artifactId>com.xyz.foundation.web.rest.provider</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.xyz.masterdata.party</groupId>
        <artifactId>com.xyz.masterdata.party.logic.provider</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.xyz.masterdata.party</groupId>
        <artifactId>com.xyz.masterdata.party.rest.provider</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
</dependencies>

我的 bndrun 文件在这里给出:

-runfw: org.eclipse.osgi;version=3.13
-runee: JavaSE-1.8
-runprovidedcapabilities: ${native_capability}

-resolve.effective: active

-runproperties: \
    osgi.console=,\
    org.osgi.service.http.port=9001,\
    osgi.console.enable.builtin=false

-runrequires: \
    osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)',\
        osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)',\
    bnd.identity;id='com.mysql.jdbc',\
    bnd.identity;id='org.ops4j.pax.jdbc.mysql',\
    bnd.identity;id='com.fasterxml.jackson.core.jackson-core',\
    bnd.identity;id='com.fasterxml.jackson.core.jackson-databind',\
    bnd.identity;id='com.fasterxml.jackson.jaxrs.jackson-jaxrs-base',\
    bnd.identity;id='com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider',\
    bnd.identity;id='com.xyz.foundation.common.provider',\
    bnd.identity;id='com.xyz.foundation.web.rest.api',\
    bnd.identity;id='com.xyz.foundation.web.rest.provider',\
    bnd.identity;id='com.xyz.masterdata.party.logic.provider',\
    bnd.identity;id='com.xyz.masterdata.party.rest.provider',\
        osgi.identity;filter:='(osgi.identity=com.xyz.masterdata.application.services)'
-runbundles: \
    ch.qos.logback.classic;version='[1.2.3,1.2.4)',\
    ch.qos.logback.core;version='[1.2.3,1.2.4)',\
    com.xyz.masterdata.application.services;version='[1.0.0,1.0.1)',\
        com.fourthiq.masterdata.party.logic.provider;version='[0.0.0,0.0.1)',\
    com.mysql.jdbc;version='[5.1.46,5.1.47)',\
    org.apache.aries.jpa.javax.persistence_2.1;version='[2.7.0,2.7.1)',\
    org.apache.felix.configadmin;version='[1.9.8,1.9.9)',\
    org.apache.felix.configurator;version='[1.0.6,1.0.7)',\
    org.apache.felix.gogo.command;version='[1.0.2,1.0.3)',\
    org.apache.felix.gogo.runtime;version='[1.0.10,1.0.11)',\
    org.apache.felix.gogo.shell;version='[1.0.0,1.0.1)',\
    org.apache.felix.scr;version='[2.1.10,2.1.11)',\
    org.ops4j.pax.jdbc.mysql;version='[1.3.5,1.3.6)',\
    org.osgi.service.transaction.control;version='[1.0.0,1.0.1)',\
    slf4j.api;version='[1.7.25,1.7.26)',\
    tx-control-provider-jdbc-xa;version='[1.0.0,1.0.1)',\
    tx-control-service-xa;version='[1.0.0,1.0.1)',\
    com.fasterxml.jackson.core.jackson-annotations;version='[2.9.8,2.9.9)',\
    com.fasterxml.jackson.core.jackson-core;version='[2.9.8,2.9.9)',\
    com.fasterxml.jackson.core.jackson-databind;version='[2.9.8,2.9.9)',\
    com.fasterxml.jackson.jaxrs.jackson-jaxrs-base;version='[2.9.8,2.9.9)',\
    com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider;version='[2.9.8,2.9.9)',\
    com.xyz.foundation.common.provider;version='[0.0.0,0.0.1)',\
    com.xyz.foundation.web.rest.api;version='[0.0.0,0.0.1)',\
    com.xyz.foundation.web.rest.provider;version='[0.0.0,0.0.1)',\
    org.apache.aries.javax.jax.rs-api;version='[1.0.0,1.0.1)',\
    com.xyz.masterdata.party.rest.provider;version='[0.0.0,0.0.1)',\
    io.swagger.core.v3.swagger-annotations;version='[2.0.7,2.0.8)',\
    org.apache.aries.jax.rs.whiteboard;version='[1.0.1,1.0.2)',\
    org.apache.felix.http.jetty;version='[4.0.6,4.0.7)',\
    org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
    org.apache.servicemix.specs.annotation-api-1.3;version='[1.3.0,1.3.1)',\
    org.osgi.service.jaxrs;version='[1.0.0,1.0.1)',\
    org.osgi.util.function;version='[1.1.0,1.1.1)',\
    org.osgi.util.promise;version='[1.1.0,1.1.1)',\
    tx-control-provider-jpa-xa;version='[1.0.0,1.0.1)'

很遗憾,我在启动应用程序时收到以下错误:

randy@MacBook-Pro target % java -jar com.xyz.masterdata.application.services.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/osgi/framework/ServiceListener
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at aQute.launcher.pre.EmbeddedLauncher.executeWithRunPath(EmbeddedLauncher.java:145)
    at aQute.launcher.pre.EmbeddedLauncher.findAndExecute(EmbeddedLauncher.java:106)
    at aQute.launcher.pre.EmbeddedLauncher.main(EmbeddedLauncher.java:51)
Caused by: java.lang.ClassNotFoundException: org.osgi.framework.ServiceListener
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 14 more

请注意,我可以使用引用的 .bndrun 文件从 Eclipse 中很好地启动应用程序,并且在使用 gradle 时会很好地生成应用程序。

我用来构建这个可运行jar文件的maven命令简单如下:

mvn clean package

我进一步提取了可运行 jar 文件的内容,下面显示了嵌入的 jar 文件。

所以很明显,所需的 jar 文件没有放入可运行的 jar 文件中。但我不清楚这是为什么。

但是,我正在从 gradle 过渡到 maven,并且似乎被困在最后一项上。解决指针表示赞赏。

谢谢, 兰迪

【问题讨论】:

  • 你使用哪个版本的 bnd maven 插件?
  • 我使用的是 v4.3.1。注意 groupId 是 biz.aQute.bnd,而不是 org.apache.felix。关于后一点,不确定哪个是首选。

标签: maven osgi bnd bndtools


【解决方案1】:

也许你缺少对 felix 框架的依赖。不知道为什么它会在 bndtools 中工作。

    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.framework</artifactId>
        <version>6.0.3</version>
    </dependency>

我认为问题在于您指定了“-runfw: org.eclipse.osgi;version=3.13”,它选择了Equinox 框架。您应该使用 bndtools 视图切换到 felix 框架。

也许它可以在 eclipse 中运行,因为 eclipse 在 Equinox 上运行 .. 不确定。

【讨论】:

  • 我已将 felix.framework 依赖项添加到我的 pom.xml,但错误仍然存​​在。我还使用 pom.xml 依赖项和整个 .bndrun 文件更新了原始帖子。感谢您的反馈,不胜感激。
  • 我还在我的原始帖子中添加了一个可运行 jar 文件的提取内容的屏幕截图。似乎我的依赖项都没有进入 jar 目录......这最终是问题所在。所以我的 pom.xml 文件的构建说明中一定缺少一些定义。只是不确定那会是什么。
  • 你可以看看我的 osgi best practice repo。也许您缺少索引定义。 github.com/cschneider/osgi-best-practices/blob/… 。顺便说一句,您还必须参考 bndrun 中的索引。
猜你喜欢
  • 2010-11-19
  • 2020-03-02
  • 2011-05-30
  • 2011-03-06
  • 2015-06-12
  • 2013-07-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多