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

时间:2010-11-10 23:41:57

标签: module dependencies maven

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

5 个答案:

答案 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存储库策略中。