[英]adding classpath using appassembler-maven-plugin for generating batch file
[英]appassembler-maven-plugin - how to include native library files when generating scripts for Windows and Unix
嗨,我正在使用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程序,以便它使用本機庫文件,這些文件包含在發行版的“本機”文件夾中(Windows的.dll文件和unix環境的.so文件包含在本機目錄中)
我想編輯構建過程,以使生成的腳本(Unix的Shell腳本和Windows的批處理腳本)都包含參數“ -Djava.library.path = PATH_OF_LIBRARY_FILES”。
我已經進行了一些搜索,但是在appassembler插件中找不到有關該參數支持的任何文檔。
我試圖通過向應用程序pom文件中添加“ extraJvmArguments”標簽並在其中指定“ -Djava.library.path”參數來找到“ hacky”解決方案,但是在Windows和Windows上,路徑分隔符不同時遇到了問題linux(“ \\”或“ /”)。 我還考慮過使用“ extraJvmArguments”並使用系統變量來指定目錄的路徑(必須由用戶定義),但是這種方法也存在平台問題,因為在Linux上使用$ VARIABLE_NAME引用了系統變量,但在Windows上使用%VARIABLE_NAME%。
我們可以要求最終用戶在執行腳本之前自行編輯執行腳本,但是如果該過程是自動的並且對最終用戶完全透明,那會更好。 這樣,最終用戶甚至不會知道他們正在運行Java應用程序,該應用程序正在使用JNI調用本機庫。
我不知道任何與平台無關的解決方案。 appassembler是否已支持此要求? 還是應該如何處理?
根據此處和此處的 maven-assembly-plugin 來源 ,單個設置<repositoryName>lib</repositoryName>
控制java.library.path
和jar classpath目錄。
隨意對功能請求進行投票以將它們分開:
我找到了一種獲得期望結果的方法,但是它涉及到復制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>
如果您知道解決問題的更好方法,請分享。
這是來自官方網站的示例: 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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.