1

我同时使用程序集和 jar 插件来部署我的应用程序。我还使用 jar 插件来帮助我在清单文件中生成类路径

<addClasspath>true</addClasspath>

虽然这似乎可行,但当我尝试执行 jar(它指定了正确的主类)时,问题就出现了——它将无法找到实际上是传递依赖的库。所以我的项目A依赖于项目B,而项目B又依赖于jar C。组装插件会正确压缩A、B和C,但是jar插件没有在manifest中包含C,导致ClassNotFoundException。

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

我做对了吗?还有其他人设法将传递依赖项生成到清单中吗?也许我做错了什么或不正常。任何帮助表示赞赏。

4

3 回答 3

7

我试图解决上述问题。就我而言,它有效(maven-jar-plugin v2.2)。我有一个名为 jarloading 的父项目,它有 3 个孩子:

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

打电话后

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 没有什么特别之处。

并附上源代码和二进制文件: 源代码 二进制文件

于 2009-07-06T11:08:05.897 回答
3

我无法让 maven-jar-plugin 工作,我不得不使用 maven-assembly-plugin。

例子:

于 2009-08-13T19:53:09.137 回答
0

我有点设法解决...实际上没有解决它。我仔细检查了一下,仍然不知道为什么一些传递依赖项没有被拾取——它似乎跳过了它们,它们最终没有被生成到清单中。

我挖了一点,玩了 maven-dependency-plugin。令人惊讶的是,配置<attach>true</attach>并将其绑定到assembly:assembly阶段解决了类路径问题。

于 2009-07-06T13:00:28.527 回答