我如何修复maven exec:java哪个是jar文件名?

时间:2013-01-09 12:11:42

标签: java maven jogl

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

在Maven中没有主动维护JOGL,因此我编写了一个小脚本,通过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-当地人 - 窗口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,例如gluegen-rt-natives-windows-i586- 2.0 .jar,但是exec:java期望jar被称为gluegen- 2.0 -natives-windows-i586.jar 。

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

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

1 个答案:

答案 0 :(得分:3)

执行:java与你的问题无关。

JOGL本身具有某种复杂的内部机制,可以通过JNI管理本机代码,该机制对文件名进行假设,这与文件库中命名文件的Maven规则不兼容。

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