【问题标题】:maven-jar-plugin and transitive dependenciesmaven-jar-plugin 和传递依赖
【发布时间】:2010-11-08 08:01:08
【问题描述】:

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

<addClasspath>true</addClasspath>

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    例子:

    【讨论】:

      【解决方案2】:

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

      我挖了一下并使用了 maven-dependency-plugin。令人惊讶的是,配置 &lt;attach&gt;true&lt;/attach&gt; 并将其绑定到 assembly:assembly 阶段解决了类路径问题。

      【讨论】:

      • 对于其他找到此答案的人,我相信它不会添加标记为可选(如果未找到)或标记为提供范围的依赖项。
      【解决方案3】:

      我试图解决上述问题。就我而言,它有效(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 并没有什么特别之处。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-25
        • 2011-09-12
        • 2015-04-12
        • 2019-08-03
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        相关资源
        最近更新 更多