我有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>
....
答案 0 :(得分:20)
看起来它应该对我有用。但您可以尝试mvn install
而不是mvn package
。
答案 1 :(得分:11)
尝试$ {project.version}
e.g。
<dependency>
<groupId>AAA</groupId>
<artifactId>B</artifactId>
<version>${project.version}</version>
</dependency>
答案 2 :(得分:9)
我的问题是如何解决这个问题?
依赖性解析是通过本地存储库完成的,因此“解决”问题的规范方法是从A运行install
,以便模块安装在本地存储库中。
现在,关于以下评论
但如果我选择安装,那么也将安装c war文件。在我目前的项目中不接受那个“。
当然,我不是你的项目,我不知道所有的约束和规则。但是如果你决定使用Maven,这是一个完全荒谬的政策(严重的是,WTF?)并且使用system
范围的依赖肯定不是一个好的解决方案(以后保证更多的麻烦)。如果这个政策是真的,那么最好不要在这种情况下使用Maven。
答案 3 :(得分:3)
我有一个解决方案:使用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>
答案 4 :(得分:1)
执行mvn install只会将工件放入正在运行命令的计算机的本地.m2存储库中。怎么可以接受?我同意帕斯卡尔。如果你建造A,就没有理由把战争放在那里。
另一方面,如果您使用的是Maven 2.2.x,请查看maven reactor plugin?这应该有助于疯狂的不可接受的无法将C.war安装到当前项目的本地.m2存储库策略中。