вопросы о bnd-export-maven-plugin - PullRequest
0 голосов
/ 26 января 2020

Я использую 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.

Команда maven, которую я использовал для создания этого файла jar, работающего под управлением, просто выглядит следующим образом:

mvn clean package

Я дополнительно извлек содержимое файла jar, работающего под управлением, на следующем рисунке показаны встроенные файлы JAR.

enter image description here

Таким образом, очевидно, что необходимые файлы JAR не попадают в исполняемый файл JAR. Но мне непонятно, почему это так.

Я делаю переход от gradle к maven и, похоже, застрял в этом последнем пункте. Указатели для разрешения приветствуются.

Спасибо, Рэнди

1 Ответ

0 голосов
/ 26 января 2020

Возможно, вам не хватает зависимости от феликс фреймворка. Не уверен, почему тогда он работает в bndtools.

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

Я думаю, проблема в том, что вы указываете "-runfw: org.eclipse.osgi; версия = 3.13", которая выбирает среду равноденствия. Вы должны использовать представление bndtools, чтобы переключиться на среду феликса.

Может быть, это работает в затмении, так как затмение выполняется в день равноденствия ... не уверен.

...