簡體   English   中英

appassembler-maven-plugin-在為Windows和Unix生成腳本時如何包括本機庫文件

[英]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目錄。

隨意對功能請求進行投票以將它們分開:

選擇將本機庫放在單獨的目錄中,在類路徑#62中不可見

我找到了一種獲得期望結果的方法,但是它涉及到復制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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM