如何使一个模块依赖于另一个模块工件?
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 存储库策略中。
【讨论】:
哦,你是对的。如果安装只将工件复制到本地存储库,那对我来说没问题。我虽然安装会将工件复制到远程存储库(我在安装和部署之间感到困惑)。谢谢。以上是关于如何使一个模块依赖于另一个模块工件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Kotlin/native 生成依赖于另一个的 .framework?
如何使一个 ReactJS Store 依赖于另一个 Store?