【问题标题】:Maven mulit-module dependencies, - package does not exist (maven plugin classloader)Maven 多模块依赖,- 包不存在(maven 插件类加载器)
【发布时间】:2016-10-01 02:51:11
【问题描述】:

我有一个具有以下设置的多模块 maven 项目。

/root/pom.xml
/root/core/proj1/pom.xml
/root/core/proj2/pom.xml
/root/support
/root/support/proj3/pom.xml

父pom如下(仅包括相关部分)

<groupId>com.mycompany.abc</groupId>
<artifactId>platform</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<name>platform-parent</name>

<modules>
    <module>support/proj3-service</module>
    <module>core/proj1-service</module>
    <module>core/proj2-service</module>
</modules>

proj1/pom.xml如下,

<artifactId>proj1</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<parent>
    <groupId>com.mycompany.abc</groupId>
    <artifactId>platform</artifactId>
    <version>1.0</version>
    <relativePath>../../pom.xml</relativePath>
</parent>

proj2/pom.xml如下,

<artifactId>proj2</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<parent>
    <groupId>com.mycompany.abc</groupId>
    <artifactId>platform</artifactId>
    <version>1.0</version>
    <relativePath>../../pom.xml</relativePath>
</parent>

现在,在 proj3/pom.xml 中,我将 proj1 和 proj2 添加为依赖项,

<artifactId>proj3</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<parent>
    <groupId>com.mycompany.abc</groupId>
    <artifactId>platform</artifactId>
    <version>1.0</version>
    <relativePath>../../pom.xml</relativePath>
</parent>
<dependencies>
    <dependency>
        <groupId>com.mycompany.abc</groupId>
        <artifactId>proj1</artifactId>
        <version>1.0</version>
     </dependency>
    <dependency>
        <groupId>com.mycompany.abc</groupId>
        <artifactId>proj2</artifactId>
        <version>1.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
       <plugin>
       ...
       </plugin>
     </plugins>
  </build>

项目 3 中的插件想要查询属于 proj1 和 proj2 的类。

根据插件类加载器文档, 请注意,插件类加载器既不包含当前项目的依赖项,也不包含其构建输出。 当一个构建插件被执行时,线程的上下文类加载器被设置为插件类加载器。

有没有办法让插件类加载器知道其他模块?

【问题讨论】:

  • 你能发布完整的错误输出吗...
  • @khmarbaise 已编辑
  • 您应该更深入地了解错误消息中提到的模块:on project docs-generation: Compilation failure at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)...除此之外。这不是完整的错误输出...还有更多...提供了很好的提示..
  • @khmarbaise 感谢这里的提示。我非常关注我设置多模块项目的方式问题。我已经更新了问题。
  • 要么你没有问清楚你的问题(由于对你真正的问题的误解?)和/或我错过了一些东西,但你试图实现的目标在 maven 中似乎是非常基本的(一个 maven具有多个模块的项目,其中一个依赖于其他模块)。此外,我不明白您为什么将后缀 -service 添加到您的模块中,这对我来说没有多大意义,并且可能是根本原因之一。

标签: java maven multi-module


【解决方案1】:

问题出在父 pom 的 modules 标签中。
而不是:

<modules>
    <module>support/proj3-service</module>
    <module>core/proj1-service</module>
    <module>core/proj2-service</module>
</modules>

应该是:

<modules>
    <module>support/proj3</module>
    <module>core/proj1</module>
    <module>core/proj2</module>
</modules>

【讨论】:

  • maven 算出来了。看看maven反应器机制。它是 Maven 核心的一部分。 maven.apache.org/guides/mini/guide-multiple-modules.html
  • 你至少尝试过我的建议吗? maven reactor 负责通过确定模块之间的依赖关系来确定构建顺序,但是您必须首先正确指定在哪里找到模块。根据您在问题中提到的目录结构,没有名称为proj3-serviceproj2-service 等的文件夹。因此,maven reactor 将无法找到您的模块并且构建将失败。如果尚未完成,请按照我的建议尝试一次,然后告诉我们结果。
  • 我已经做到了。问题在于插件类加载器无法查询依赖项 jar。
  • 好的。您能否在您的第三个项目的 pom.xml 中提供错误日志和插件代码。
  • 插件类加载器无法从项目依赖中加载类。看看 maven 如何在不同的 maven 组件之间抽象类加载器任务。 cwiki.apache.org/confluence/display/MAVEN/….
【解决方案2】:

如果您想添加额外的 .jar 供 maven 插件使用/查看,您可以向插件添加依赖项。

类似的东西:

<build><plugins><plugin>
<!-- other plugin option -->
<dependencies>
  <dependency>
    <groupId>com.mycompany.abc</groupId>
    <artifactId>proj1</artifactId>
    <version>1.0</version>
 </dependency>
 <dependency>
    <groupId>com.mycompany.abc</groupId>
    <artifactId>proj2</artifactId>
    <version>1.0</version>
 </dependency>
</dependencies>
</plugin></plugins></build>

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2013-08-08
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2013-10-12
    • 2019-08-21
    • 2014-11-18
    相关资源
    最近更新 更多