您正在使用appassembler-maven-plugin处理内置于分发文件(zip文件)中的Java应用程序。最终用户提取zip的内容。
使用此插件,我们构建了一个分发结构,其中包含所需的jar和两个执行脚本(unix的shell脚本和windows的批处理脚本)。这些脚本由构建过程自动生成。
pom文件包含以下内容:
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<attach>true</attach>
<descriptors>
<descriptor>src/main/resources/distribution.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!-- this is used for inheritance merges -->
<phase>package</phase>
<!-- bind to the packaging phase -->
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<executions>
<execution>
<id>assemble-standalone</id>
<phase>package</phase>
<goals>
<goal>assemble</goal>
</goals>
<configuration>
<programs>
<program>
<name>mixnet</name>
<mainClass>com.company.products.Application</mainClass>
</program>
</programs>
<repositoryLayout>flat</repositoryLayout>
<repositoryName>lib</repositoryName>
<configurationDirectory>properties</configurationDirectory>
<binFileExtensions>
<unix>.sh</unix>
</binFileExtensions>
<copyConfigurationDirectory>true</copyConfigurationDirectory>
<configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>attach-distribution</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>target/${project.artifactId}-${project.version}-distribution.zip</file>
<type>zip</type>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
生成的shell脚本包含以下行,它实际调用Java:
%JAVACMD% %JAVA_OPTS% %EXTRA_JVM_ARGUMENTS% -classpath%CLASSPATH_PREFIX%;%CLASSPATH% -Dapp.name="mixnet" -Dapp.repo="%REPO%" -Dbasedir="%BASEDIR%" com.company.products.Application %CMD_LINE_ARGS%
批处理脚本包含以下行,它实际调用Java:
exec "$JAVACMD" $JAVA_OPTS \
$EXTRA_JVM_ARGUMENTS \
-classpath "$CLASSPATH" \
-Dapp.name="mixnet" \
-Dapp.pid="$$" \
-Dapp.repo="$REPO" \
-Dapp.home="$BASEDIR" \
-Dbasedir="$BASEDIR" \
com.company.products.Application \
"$@"
我们现在扩展了Java程序,使其使用本机库文件,这些文件包含在名为“native”的文件夹中(.dll文件用于windows,而.so文件用于unix环境包含在本机中)目录)
我想编辑构建过程,以便生成的脚本(unix的shell脚本和windows的批处理脚本)包含参数“-Djava.library.path = PATH_OF_LIBRARY_FILES”。
我已经做了一些搜索,但是我无法找到有关在appassembler插件中支持此参数的任何文档。
我尝试通过将“extraJvmArguments”标记添加到应用程序pom文件并在那里指定“-Djava.library.path”参数来找到“hacky”解决方案,但是我遇到了路径分隔符不同的问题在Windows和Linux(“\”或“/”)上。我还想过使用“extraJvmArguments”并使用系统变量来指定目录的路径(必须由用户定义),但是这种方法也存在平台问题,因为在linux上使用$ VARIABLE_NAME引用了系统变量,但在Windows上有%VARIABLE_NAME%。
我们可以要求最终用户在执行之前自己编辑执行脚本,但如果流程是自动的,并且对最终用户完全透明,那就更好了。通过这种方式,最终用户甚至不知道他们正在运行使用JNI调用本机库的Java应用程序。
我不知道任何平台中立的解决方案。 appassembler是否已经支持此要求?或者应该如何处理?
答案 0 :(得分:1)
根据maven-assembly-plugin sources here和here,单一设置<repositoryName>lib</repositoryName>
控制java.library.path
和jar类路径目录。
随意投票支持功能请求将它们分开:
Option to have native libraries in separate directory, not visible in classpath #62
答案 1 :(得分:0)
我找到了获得理想结果的方法,但它涉及复制pom的很大一部分。我复制了执行部分,并在每次执行中添加了特定于平台的extraJvmArguments值,如下所示。然后,构建过程使用正确的平台特定路径构建执行脚本。
<executions>
<execution>
<id>assemble-standalone-windows</id>
<phase>package</phase>
<goals>
<goal>assemble</goal>
</goals>
<configuration>
<extraJvmArguments>-Djava.library.path=.\..\native\lib</extraJvmArguments>
<programs>
<program>
<platforms>
<platform>windows</platform>
</platforms>
<name>mixnet</name>
<mainClass>com.company.products.Application</mainClass>
</program>
</programs>
<repositoryLayout>flat</repositoryLayout>
<repositoryName>lib</repositoryName>
<configurationDirectory>properties</configurationDirectory>
<binFileExtensions>
<unix>.sh</unix>
</binFileExtensions>
<copyConfigurationDirectory>true</copyConfigurationDirectory>
<configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
</configuration>
</execution>
<execution>
<id>assemble-standalone-unix</id>
<phase>package</phase>
<goals>
<goal>assemble</goal>
</goals>
<configuration>
<extraJvmArguments>-Djava.library.path=./../native/lib</extraJvmArguments>
<programs>
<program>
<platforms>
<platform>unix</platform>
</platforms>
<name>mixnet</name>
<mainClass>com.scytl.products.ov.mixnet.Application</mainClass>
</program>
</programs>
<repositoryLayout>flat</repositoryLayout>
<repositoryName>lib</repositoryName>
<configurationDirectory>properties</configurationDirectory>
<binFileExtensions>
<unix>.sh</unix>
</binFileExtensions>
<copyConfigurationDirectory>true</copyConfigurationDirectory>
<configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
</configuration>
</execution>
</executions>
如果您知道解决问题的更好方法,请分享。
答案 2 :(得分:0)
以下是官方网站的示例:https://maven.apache.org/plugins/maven-assembly-plugin/usage.html
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>your main class</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>