我有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>
....
7条答案
按热度按时间iqjalb3h1#
试试
${project.parent.version}
例如
wswtfjt72#
我觉得应该能行。但您可以尝试
mvn install
而不是mvn package
。vhipe2zx3#
我的问题是如何解决这个问题?
依赖关系解析是通过本地仓库完成的,所以“解决”这个问题的规范方法是从A运行
install
,这样模块就会安装在本地仓库中。关于以下评论
但是如果我选择install,那么c war文件也会被安装。我目前的项目不接受这一点”。
当然,我不是你的项目,我不知道所有的约束和规则。但是如果你决定使用Maven,这是一个完全荒谬的政策(说真的,WTF?),并且使用
system
作用域依赖项肯定不是一个好的解决方案(以后肯定会有更多麻烦)。如果这个策略是真实的,那么最好不要在这种情况下使用Maven。kcwpcxri4#
我有一个解决办法:在scope=system中使用依赖关系
在C pom.xml中
在A pom.xml中,将模块B放在顶部,如下所示
neekobn85#
执行mvn install只会将工件放置到运行该命令的机器的本地.m2存储库中。这怎么能不被接受呢?我同意Pascal。如果你建了A,那么战争就不应该发生在那里.
另一方面,如果你使用的是Maven 2.2.x,看看maven reactor plugin?这应该有助于疯狂的不可接受的不能安装C.war到当前项目的本地.m2存储库策略。
d5vmydt96#
如果你的机器上有
moduleA
,比如在D:\moduleA
和moduleA
内部,你已经在D:\moduleA\moduleB
创建了另一个模块,比如moduleB
,为了在moduleA
内部使用moduleB
,你需要在moduleA
的pom.xml
文件中创建一个依赖项,如下所示:要编译项目以便您可以使用它,请从模块文件夹(
moduleB
)执行以下操作:5us2dqdw7#
以下是我为解决它所做的:
1.在intelij中,从现有源代码创建新模块。
1.将A.pom中依赖项B的版本更改为B.pom中B的版本