maven-jar-plugin和传递依赖

时间:2009-07-06 08:46:41

标签: maven-2 assemblies jar classpath maven-plugin

我正在使用程序集和jar插件来部署我的应用程序。我也使用jar插件来帮助我使用

在清单文件中生成类路径
<addClasspath>true</addClasspath>

虽然这似乎有效,但是当我尝试执行jar(它有一个适当的主类指定)时会出现问题 - 它将无法找到一个实际上是传递依赖的库。所以我的项目A依赖于项目B,项目B依赖于jar C.程序集插件将正确压缩A,B和C,但jar插件在清单中不包含C,导致ClassNotFoundException。

我没有看到maven-jar-plugin中的任何选项让我指定需要传递依赖。

我是以正确的方式做到的吗?其他人设法在清单中生成传递依赖关系吗?也许我做错了什么或出了问题。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:7)

我试图解决上面提到的问题。在我的情况下它工作(maven-jar-plugin v2.2)。 我有一个名为jarloading的父项目有3个孩子:

  • main:依赖于
  • a:依赖于b
  • b:依赖于

之后

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阶段解决了类路径问题。