2010-11-10 81 views
21

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

正如最佳实践(与此问题无关),模块B和C不应声明自己的groupId和版本;他们应该从父(模块A)POM继承这些。他们仍然需要申报自己的包装和artifactId。 – 2010-12-08 00:17:42

回答

14

看起来它应该工作给我。但您可以尝试mvn install而不是mvn package

+0

谢谢。这是一个好主意。但是如果我去安装,那么c war文件也将被安装。那个在我目前的项目中是不被接受的。只有jar文件被允许安装 – David 2010-11-11 04:46:01

+0

你是对的马特。我会去安装。 – David 2010-11-14 22:10:09

3

我有一个解决方案:使用具有范围的依赖性=系统

用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> 

和在一个pom.xml,把模块B上这样

顶端
<modules> 
     <module>B</module>  
     <module>C</module> 
</modules> 
+2

大卫,我不知道你在做什么以及为什么“在你现在的项目中战争不被接受”,但不是冒犯,这绝对不是正确的方法。 – 2010-11-12 07:06:33

5

我的问题是我如何解决这个问题?

相关决议通过本地存储库这样做的正规途径“解决”这个问题是从运行install,这样模块将获得安装在本地仓库。

现在,关于这样的评论

但是,如果我再安装Ç战争文件去也将安装。那一个不是在我的当前项目”接受。

当然,我不是你的项目,我不知道所有的约束和规则。但是,如果你决定使用Maven,这是一个完全荒谬的政策(认真地说,WTF?)和使用范围依赖关系当然不是一个好的解决方案(后来保证会有更多的麻烦),如果这个政策是真实的,那么最好不要在这种情况下使用Maven

+0

哦,你说得对。如果安装只将工件复制到本地存储库,那对我来说没问题。我虽然安装将复制工件到远程存储库(我在安装和部署之间感到困惑)。谢谢。 – David 2010-11-14 22:11:05

1

做mvn安装只放置如果你创建了A,那么战争就没有理由放在那里了。

另一方面,如果您使用的是Maven 2.2.x,请查看maven reactor plugin?这应该有助于疯狂的不可接受的无法将C.war安装到当前项目的本地.m2存储库策略中。

+0

哦,你说得对。如果安装只将工件复制到本地存储库,那对我来说没问题。我虽然安装将复制工件到远程存储库(我在安装和部署之间感到困惑)。谢谢。 – David 2010-11-14 22:09:06

相关问题