如何使一个模块依赖于另一个模块工件?

Posted

技术标签:

【中文标题】如何使一个模块依赖于另一个模块工件?【英文标题】:How to make one module depend on another module artifact? 【发布时间】:2011-05-08 04:52:06 【问题描述】:

我有 Maven 多模块项目。

 A: parent.
    B: child1.
    C: child2.

B会被打包得到jar文件,然后c会使用这个jar文件来编译代码。

在 B 中,如果我运行mvn package,它将创建b.jar(停留在B/target/jars 而不是B/target - 用于其他目的)。

在 C 语言中,我需要使用 b.jar 来编译代码。

现在,从 A,当我运行时:mvn package。首先,我成功为B创建了b.jar文件。

但是在 C 的编译阶段,看起来 C 无法识别类路径中的b.jar(编译出错,因为 C 的代码无法从 B 导入类文件)。

我的问题是:我该如何解决这个问题?

---------Below 是 pom 文件

A: pom.xml
  <groupId>AAA</groupId>
  <artifactId>A</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

   <modules>
   <module>C</module>
   <module>B</module>
   </modules>

B: pom.xml
        <groupId>AAA</groupId>
 <artifactId>B</artifactId>
 <packaging>jar</packaging>
 <version>0.0.1-SNAPSHOT</version>
 <parent>
  <artifactId>A</artifactId>
  <groupId>AAA</groupId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>

C: pom.xml
       <parent>
  <artifactId>A</artifactId>
  <groupId>AAA</groupId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>

 <groupId>AAA</groupId>
 <artifactId>C</artifactId>
 <packaging>war</packaging>
 <version>0.0.1-SNAPSHOT</version>

 <dependencies>

  <dependency>
   <groupId>AAA</groupId>
   <artifactId>B</artifactId>
   <version>0.0.1-SNAPSHOT</version>
  </dependency>
....

【问题讨论】:

作为最佳实践(与此问题无关),模块 B 和 C 不应声明自己的 groupId 和版本;他们应该从父(模块 A)POM 继承这些。不过,他们仍然需要声明自己的包装和 artifactId。 【参考方案1】:

试试$project.version

例如

<dependency>
   <groupId>AAA</groupId>
   <artifactId>B</artifactId>
   <version>$project.version</version>
</dependency>

【讨论】:

这解决了我的问题。经过大量的文章,我认为这是正确的做法。唯一需要注意的是,您的模块版本需要与依赖模块的版本同步。 只想注意 $project.version 现在已弃用。在新项目中使用:$project.parent.version 谢谢,这是一个救生员。为我节省了很多精力。【参考方案2】:

看起来它应该对我有用。但你可以试试mvn install 而不是mvn package

【讨论】:

谢谢。这是个好主意。但是,如果我使用 install ,那么 c war 文件也将被安装。我目前的项目不接受那个。只允许安装jar文件【参考方案3】:

我的问题是如何解决这个问题?

依赖关系解析是通过本地存储库完成的,因此“解决”问题的规范方法是从 A 运行 install,以便将模块安装在本地存储库中。

现在,关于以下评论

但如果我使用 install ,那么 c war 文件也会被安装。我目前的项目不接受那个”。

当然,我不在你的项目中,我不知道所有的限制和规则。但是,如果您决定使用 Maven,这是一个完全荒谬的策略(说真的,WTF?)并且使用system 范围依赖肯定不是一个好的解决方案(以后肯定会遇到更多麻烦)。如果这个政策是真实的,最好不要在这种情况下使用 Maven。

【讨论】:

哦,你是对的。如果安装只将工件复制到本地存储库,那对我来说没问题。我虽然安装会将工件复制到远程存储库(我在安装和部署之间感到困惑)。谢谢。【参考方案4】:

我有一个解决方案:使用 scope=system 的依赖项

在 C pom.xml 中

           <dependency>
            <groupId>AAA</groupId>
            <artifactId>B</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>system</scope>
            <systemPath>$basedir\..\B\target\jars\b.jar</systemPath>
        </dependency>

在 A pom.xml 中,像这样将模块 B 放在顶部

<modules>
       <module>B</module>       
       <module>C</module>
 </modules>

【讨论】:

大卫,我不知道你在做什么以及为什么“在你当前的项目中不接受战争”但是,不是冒犯,这绝对不是正确的方式。【参考方案5】:

执行 mvn install 只会将工件放入您正在运行该命令的机器的本地 .m2 存储库中。这怎么能不能接受?我同意帕斯卡。如果你建造 A,那么应该没有理由将战争放在那里。

另一方面,如果您使用的是 Maven 2.2.x,请查看 maven reactor plugin?这应该有助于那些无法接受的疯狂无法将 C.war 安装到当前项目的本地 .m2 存储库策略中。

【讨论】:

哦,你是对的。如果安装只将工件复制到本地存储库,那对我来说没问题。我虽然安装会将工件复制到远程存储库(我在安装和部署之间感到困惑)。谢谢。

以上是关于如何使一个模块依赖于另一个模块工件?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到依赖于另一个工件的工件?

如何创建依赖于另一个 JAR 的 JAR?

如何使用 Kotlin/native 生成​​依赖于另一个的 .framework?

如何使一个 ReactJS Store 依赖于另一个 Store?

如何解决模块 X 的多个工件被检索到 Apache Ivy 中的同一个文件?

访问如何使一个单元格值依赖于另一个单元格中的值