gpt4 book ai didi

java - 如何修复 maven exec :java which is mangling jar file names?

转载 作者:行者123 更新时间:2023-12-02 00:04:04 25 4
gpt4 key购买 nike

我正在 Windows 上使用 JOGL 开发一个应用程序。到目前为止,我一直在使用 Eclipse,但我已经开始编写相应的 Maven POM 文件,以便我可以自动执行构建和打包步骤。

JOGL 没有在 Maven 中积极维护,因此我编写了一个小脚本,通过 install:install-file 将 jar 文件导入到我的本地存储库中:

set JOGL_VER=2.0
set JOGL_HOME=./jogl
set JOGL_LIB=%JOGL_HOME%/jar
set MVN_INSTALL=call mvn install:install-file

%MVN_INSTALL% -DgroupId=org.jogamp.gluegen -Dfile=%JOGL_LIB%/gluegen-rt-natives-windows-i586.jar \
-DartifactId=gluegen-rt-natives-windows-i586 -Dversion=%JOGL_VER% -Dpackaging=jar
%MVN_INSTALL% -DgroupId=org.jogamp.gluegen -Dfile=%JOGL_LIB%/gluegen.jar \
-DartifactId=gluegen -Dversion=%JOGL_VER% -Dpackaging=jar

%MVN_INSTALL% -DgroupId=org.jogamp.jogl -Dfile=%JOGL_LIB%/jogl-all-natives-windows-i586.jar \
-DartifactId=jogl-all-natives-windows-i586 -Dversion=%JOGL_VER% -Dpackaging=jar
%MVN_INSTALL% -DgroupId=org.jogamp.jogl -Dfile=%JOGL_LIB%/jogl-all.jar
-DartifactId=jogl-all -Dversion=%JOGL_VER% -Dpackaging=jar

这会在我的存储库中生成以下文件

.m2\repository\org\jogamp\gluegen\gluegen\2.0\gluegen-2.0.jar
.m2\repository\org\jogamp\gluegen\gluegen\2.0\gluegen-2.0.pom
.m2\repository\org\jogamp\gluegen\gluegen-rt-natives-windows-i586\2.0\gluegen-rt-natives-windows-i586-2.0.jar
.m2\repository\org\jogamp\gluegen\gluegen-rt-natives-windows-i586\2.0\gluegen-rt-natives-windows-i586-2.0.pom
.m2\repository\org\jogamp\jogl\jogl-all\2.0\jogl-all-2.0.jar
.m2\repository\org\jogamp\jogl\jogl-all\2.0\jogl-all-2.0.pom
.m2\repository\org\jogamp\jogl\jogl-all-natives-windows-i586\2.0\jogl-all-natives-windows-i586-2.0.jar
.m2\repository\org\jogamp\jogl\jogl-all-natives-windows-i586\2.0\jogl-all-natives-windows-i586-2.0.pom

请注意,由于我指定了 2.0,因此文件的后缀为 2.0,例如gluegen-rt-natives-windows-i586-2.0.jar。

但现在我想使用 exec:java 命令在构建后运行应用程序,以确保它正常运行

mvn exec:java

所以我将 exec-maven-plugin 添加到我的 pom.xml

  <build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>com.testapp.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>

我还将依赖项添加到 JOGL。并不是说 native 二进制文件是运行时范围的,因为我在编译时不需要它们:

<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-natives-windows-i586</artifactId>
<version>2.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-natives-windows-i586</artifactId>
<version>2.0</version>
<scope>runtime</scope>
</dependency>

但是当我运行这个时,我收到以下错误

Catched FileNotFoundException: C:\Users\xxx\.m2\repository\org\jogamp\gluegen\gluegen\2.0\gluegen-2.0-natives-windows-i586.jar (
The system cannot find the file specified), while TempJarCache.bootstrapNativeLib() of jar:file:/C:/Users/xxx/.m2/repository/org
/jogamp/gluegen/gluegen/2.0/gluegen-2.0-natives-windows-i586.jar!/ (file:/C:/Users/xxx/.m2/repository/org/jogamp/gluegen/gluegen
/2.0/ + gluegen-2.0-natives-windows-i586.jar)
[WARNING]

因此,这个问题很简单。我通过 install:install-file 安装了 jar,并且版本 2.0 附加在 Artifact id 之后,例如gluegen-rt-natives-windows-i586-2.0.jar,但 exec:java 期望该 jar 名为gluegen-2.0-natives-windows-i586.jar 。

由于项目构建,我必须假设编译阶段正在使用预期的文件名正确查找 jar 文件,但 exec 不是。

为什么它会在 Artifact ID 中间转储版本号以及如何使其正常工作? Artifact id是根据约定命名的,所以我不明白为什么它会这样分割。

最佳答案

Exec:java 与您的问题无关。

JOGL 本身有某种复杂的内部机制,用于通过 JNI 管理 native 代码,并且该机制对文件名做出的假设与存储库中命名文件的 Maven 规则不兼容。

您将必须使用 maven- assembly-plugin 将依赖项复制到具有 JOGL 所需的名称和形状的树并从那里执行,或者找到一种方法来重新配置 JOGL 以容忍 Maven 命名约定.

关于java - 如何修复 maven exec :java which is mangling jar file names?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14234936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com