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

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的

我有一个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的代码无法从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>