Module 如何使一个模块依赖于另一个模块工件?
我有一个maven多模块项目Module 如何使一个模块依赖于另一个模块工件?,module,dependencies,maven,Module,Dependencies,Maven,我有一个maven多模块项目 A: parent. B: child1. C: child2. B将被打包以获取jar文件,然后c将使用这个jar文件来编译代码 在B中,如果我运行mvn包,它将创建B.jar(出于其他目的,停留在B/target/jars而不是B/target) 在C语言中,我需要使用b.jar来编译代码 现在,从A开始,当我运行:mvn包。首先,我成功地为b创建了b.jar文件 但是到了C的编译阶段,C似乎无法识别类路径中的b.jar(编译会出错,因为C的
A: parent.
B: child1.
C: child2.
B将被打包以获取jar文件,然后c将使用这个jar文件来编译代码
在B中,如果我运行mvn包
,它将创建B.jar
(出于其他目的,停留在B/target/jars
而不是B/target
)
在C语言中,我需要使用b.jar
来编译代码
现在,从A开始,当我运行:mvn包
。首先,我成功地为b创建了b.jar
文件
但是到了C的编译阶段,C似乎无法识别类路径中的b.jar
(编译会出错,因为C的代码无法从b导入类文件)
我的问题是:我如何解决这个问题
----------下面是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>
....
A:pom.xml
AAA
A.
0.0.1-快照
聚甲醛
C
B
B:pom.xml
AAA
B
罐子
0.0.1-快照
A.
AAA
0.0.1-快照
C:pom.xml
A.
AAA
0.0.1-快照
AAA
C
战争
0.0.1-快照
AAA
B
0.0.1-快照
....
我觉得应该行得通。但是您可以尝试mvn安装
而不是mvn包
我有一个解决方案:使用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>
AAA
B
0.0.1-快照
系统
${basedir}\..\B\target\jars\B.jar
在pom.xml文件中,将模块B放在上面,如下所示
<modules>
<module>B</module>
<module>C</module>
</modules>
B
C
我的问题是如何解决这个问题
依赖项解析是通过本地存储库完成的,因此“解决”问题的标准方法是从运行install
,以便在本地存储库中安装模块
现在,关于以下评论:
但如果我使用安装,那么也将安装c war文件。在我目前的项目中,这一点是不被接受的”
当然,我不在你的项目中,我不知道所有的约束和规则。但是如果你决定使用Maven,这是一个完全荒谬的策略(说真的,WTF?),使用系统范围依赖肯定不是一个好的解决方案(以后肯定会有更多的麻烦)。如果这个策略是真实的,最好不要在这种情况下使用Maven。执行mvn安装只会将工件放入运行命令的机器的本地.m2存储库中。这怎么可能不被接受?我同意Pascal的观点。如果您构建了一个,那么就没有理由将战争放在那里
另一方面,如果您使用的是Maven 2.2.x,请查看?这将有助于将C.war安装到当前项目的本地.m2存储库策略中。请尝试${project.version}
e、 g
AAA
B
${project.version}
谢谢。这是个好主意。但是如果我选择安装,那么也会安装c war文件。在我当前的项目中不接受该文件。只允许安装jar文件。David,我不知道你在做什么,也不知道为什么你当前的项目中不接受“war”“但是,不是冒犯,这绝对不是正确的方式。哦,你是对的。如果install只将工件复制到本地存储库中,这对我来说没问题。我认为install会将工件复制到远程存储库(我混淆了install和deploy)。谢谢。哦,你说得对。如果install只将工件复制到本地存储库中,这对我来说没问题。我认为install会将工件复制到远程存储库(我混淆了install和deploy)。谢谢。作为一种最佳实践(与此问题无关),模块B和C不应该声明自己的groupId和版本;他们应该从父(模块A)POM继承这些。他们仍然需要声明他们自己的包装和工件。这解决了我的问题。在阅读了很多文章之后,我认为这是正确的做法。唯一需要注意的是,您的模块版本需要与依赖模块的版本同步。
<dependency>
<groupId>AAA</groupId>
<artifactId>B</artifactId>
<version>${project.version}</version>
</dependency>