繁体   English   中英

如何修复损坏jar文件名的maven exec:java?

[英]How do I fix maven exec:java which is mangling jar file names?

我正在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后缀,例如,glugengen-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。 并不是说本机二进制文件是作用域范围内的运行时,因为我在编译时不需要它们:

<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,并且在工件ID后面附加了版本2.0,例如gelgen-rt-natives-windows-i586- 2.0 .jar,但是exec:java期望jar被称为gelengen- 2.0- natives-windows-i586.jar。

由于项目已生成,因此我必须假定编译阶段正在使用期望的文件名正确查找jar文件,但是exec却没有。

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

Exec:java与您的问题无关。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM