我正在使用程序集和jar插件来部署我的应用程序。我也使用jar插件来帮助我使用
在清单文件中生成类路径<addClasspath>true</addClasspath>
虽然这似乎有效,但是当我尝试执行jar(它有一个适当的主类指定)时会出现问题 - 它将无法找到一个实际上是传递依赖的库。所以我的项目A依赖于项目B,项目B依赖于jar C.程序集插件将正确压缩A,B和C,但jar插件在清单中不包含C,导致ClassNotFoundException。
我没有看到maven-jar-plugin中的任何选项让我指定需要传递依赖。
我是以正确的方式做到的吗?其他人设法在清单中生成传递依赖关系吗?也许我做错了什么或出了问题。任何帮助表示赞赏。
答案 0 :(得分:7)
我试图解决上面提到的问题。在我的情况下它工作(maven-jar-plugin v2.2)。 我有一个名为jarloading的父项目有3个孩子:
之后
mvn package
使用包含
的部署脚本发布它rm -r ~/Desktop/jarloading-bin
mkdir ~/Desktop/jarloading-bin
cp a/target/a-0.0.1-SNAPSHOT.jar ~/Desktop/jarloading-bin/
cp b/target/b-0.0.1-SNAPSHOT.jar ~/Desktop/jarloading-bin/
cp main/target/main-0.0.1-SNAPSHOT.jar ~/Desktop/jarloading-bin/
更改为目录
cd ~/Desktop/jarloading-bin
并正在运行
java -jar main-0.0.1-SNAPSHOT.jar
它运作良好。
但实际上重点是,如何在清单文件中列出类路径:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: rschmid
Build-Jdk: 1.6.0_07
Main-Class: Main
Class-Path: a-0.0.1-SNAPSHOT.jar b-0.0.1-SNAPSHOT.jar
主项目的pom.xml:
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<index>true</index>
<manifest>
<mainClass>Main</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>ch.fiftynine.lab</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
...
项目的pom.xml:
...
<dependencies>
<dependency>
<groupId>ch.fiftynine.lab</groupId>
<artifactId>b</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
...
b项目的pom.xml没有什么特别之处。
并附加源代码和二进制文件: source code binaries
答案 1 :(得分:3)
我无法使用maven-jar-plugin工作,我不得不使用maven-assembly-plugin。
示例:
答案 2 :(得分:0)
我有点设法解决......实际上没有解决它。我仔细检查了一下,仍然不知道为什么有些传递依赖关系没有被拾取 - 它似乎跳过它们并且它们最终没有被生成到MANIFEST中。
我挖了一下并玩了maven-dependency-plugin。令人惊讶的是,配置<attach>true</attach>
并将其绑定到assembly:assembly
阶段解决了类路径问题。