代码之家  ›  专栏  ›  技术社区  ›  aberrant80

Maven JAR插件和可传递依赖项

  •  1
  • aberrant80  · 技术社区  · 15 年前

    我使用汇编和JAR插件来部署我的应用程序。我还使用jar插件来帮助我在清单文件中使用

    <addClasspath>true</addClasspath>
    

    虽然这似乎可行,但当我尝试执行JAR(它指定了一个适当的主类)时,问题就出现了——它将无法找到实际上是可传递依赖项的库。因此,我的项目A依赖于项目B,而项目B依赖于JAR C。程序集插件将正确压缩A、B和C,但是JAR插件没有在清单中包含C,从而导致ClassNotFoundException。

    我在maven jar插件中没有看到任何允许我指定需要传递依赖项的选项。

    我这样做对吗?是否还有其他人设法将可传递依赖项生成到清单中?也许我做了错事或不正常的事情。感谢您的帮助。

    3 回复  |  直到 13 年前
        1
  •  7
  •   Raffael Schmid    15 年前

    我试图解决上述问题。在我的例子中,它起作用了(MavenJar插件2.2版)。 我有一个名为jarloading的父项目,它有3个孩子:

    • 主:依赖于
    • 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 project的pom.xml中没有真正特殊的内容。

    以及附加的源代码和二进制文件: source code binaries

        2
  •  3
  •   Stompchicken    13 年前

    我不能让maven jar插件工作,我必须使用maven程序集插件。

    实例:

        3
  •  0
  •   aberrant80    15 年前

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

    我仔细研究了一下,然后使用Maven依赖插件。令人惊讶的是,配置 <attach>true</attach> 把它绑在 assembly:assembly 阶段解决了类路径问题。