2012-10-30 27 views
1

我有这个Maven的层次结构:使用传递依赖和排除使用Maven

sim-java 
    ejb 
    web 
    log4j 
    ... 

EJB,Web和log4j的是SIM卡的Java模块和每个模块的参考SIM-java编写父标签。

我想创建一个log4j模块,并将它作为依赖项包含在sim-java中,这样log4j将作为ejb和web模块中的依赖项存在。

基本上,我的SIM-java的内部的pom.xml包含此:(我有耳的模块,其中将包括com.sim提供范围:log4j的在耳文件)

<dependencies> 
    <dependency> 
     <groupId>com.sim</groupId> 
     <artifactId>log4j</artifactId> 
     <version>${log4j.version}</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

。现在

,我对我的log4j模块内部的pom.xml这是一个:

<dependencies> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.17</version> 
    </dependency> 
</dependencies> 

我有这样的生成错误:

30/10/12 18时56分07秒CET:构建log4j错误; org.apache.maven.lifecycle.LifecycleExecutionException:无法执行项目目标log4j:无法解析项目com.sim的依赖关系:log4j:jar:0.0.1-SNAPSHOT:找不到工件com.sim:log4j:jar: 0.0.1-SNAPSHOT

我认为有,因为SIM卡的Java使用com.sim.log4j作为传递依赖一些依赖性问题,所以我测试了一下log4j的pom.xml的内部:

<dependencies> 
    <dependency> 
     <groupId>com.sim</groupId> 
     <artifactId>sim-java</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <exclusions> 
      <exclusion> 
       <groupId>com.sim</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.17</version> 
    </dependency> 
</dependencies> 

30/10/12 18:59:22 CET:[WARN] com.sim:log4j:jar:0.0.1-SNAPSHOT的POM缺失,无相关信息 30/10/12 1 8:59:22 CET:缺少工件com.sim:log4j:jar:0.0.1-SNAPSHOT:提供 30/10/12 18:59:22 CET:缺少工件com.sim:log4j:jar:0.0.1 -SNAPSHOT:提供 30/10/12 18点59分22秒CET:缺少伪影com.sim:log4j的:罐:0.0.1-SNAPSHOT:提供

也许包括内部模块com.sim.log4j( ejb,网页等)会工作,但我想通过sim-java项目使用传递依赖。

如何做到这一点?

奥利维尔

回答

2

你不能在父POM上com.sim:log4j的依赖。这种依赖性将在儿童中继承,这意味着com.sim:log4j将取决于它自己。

而是创建父POM一个<dependencyManagement/>然后声明中需要它,这里是webejb孩子使用com.sim:log4j

父POM:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.sim</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Web和EJB POM:

<dependencies> 
    <dependency> 
     <groupId>com.sim</groupId> 
     <artifactId>log4j</artifactId> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

编辑

你仍然可以有一个传递依赖仅具有对依赖来自ejb项目的log4j模块。然后,Web项目将依赖于ejb项目,并且log4j将是传递依赖项。

+0

好吧,我怀疑这种行为。这意味着我必须在所有模块中手动包含依赖项? Thx –

+0

我添加了一个编辑部分。我怀疑你的web模块依赖于ejb模块。因此,如果ejb模块对log4j模块有依赖性,它将成为Web模块中的传递依赖。 – maba

+0

感谢您的编辑,我现在理解得更好,更好的依赖关系。问候 –