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

suzh9iv8  于 2023-10-17  发布在  Maven
关注(0)|答案(7)|浏览(170)

我有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>
....
iqjalb3h

iqjalb3h1#

试试${project.parent.version}
例如

<dependency>
   <groupId>AAA</groupId>
   <artifactId>B</artifactId>
   <version>${project.parent.version}</version>
</dependency>
wswtfjt7

wswtfjt72#

我觉得应该能行。但您可以尝试mvn install而不是mvn package

vhipe2zx

vhipe2zx3#

我的问题是如何解决这个问题?
依赖关系解析是通过本地仓库完成的,所以“解决”这个问题的规范方法是从A运行install,这样模块就会安装在本地仓库中。
关于以下评论
但是如果我选择install,那么c war文件也会被安装。我目前的项目不接受这一点”。
当然,我不是你的项目,我不知道所有的约束和规则。但是如果你决定使用Maven,这是一个完全荒谬的政策(说真的,WTF?),并且使用system作用域依赖项肯定不是一个好的解决方案(以后肯定会有更多麻烦)。如果这个策略是真实的,那么最好不要在这种情况下使用Maven。

kcwpcxri

kcwpcxri4#

我有一个解决办法:在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>
neekobn8

neekobn85#

执行mvn install只会将工件放置到运行该命令的机器的本地.m2存储库中。这怎么能不被接受呢?我同意Pascal。如果你建了A,那么战争就不应该发生在那里.
另一方面,如果你使用的是Maven 2.2.x,看看maven reactor plugin?这应该有助于疯狂的不可接受的不能安装C.war到当前项目的本地.m2存储库策略。

d5vmydt9

d5vmydt96#

如果你的机器上有moduleA,比如在D:\moduleAmoduleA内部,你已经在D:\moduleA\moduleB创建了另一个模块,比如moduleB,为了在moduleA内部使用moduleB,你需要在moduleApom.xml文件中创建一个依赖项,如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" ...>
    ...
    <groupId>net.passioncloud</groupId>
    <artifactId>moduleA</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>net.passioncloud</groupId>
            <artifactId>moduleB</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
     <dependencies>
     ...

要编译项目以便您可以使用它,请从模块文件夹(moduleB)执行以下操作:

.\mvnw clean install
5us2dqdw

5us2dqdw7#

以下是我为解决它所做的:
1.在intelij中,从现有源代码创建新模块。
1.将A.pom中依赖项B的版本更改为B.pom中B的版本

相关问题