我有这个maven hierachy:
sim-java
ejb
web
log4j
...
ejb,web和log4j是sim-java的模块,每个模块都通过父标记引用sim-java。
我想创建一个log4j模块并将其作为依赖项包含在sim-java中,因此log4j将作为依赖项存在于ejb和web模块中。
基本上,我在sim-java中的pom.xml包含这个:
<dependencies>
<dependency>
<groupId>com.sim</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
(范围是因为我有一个耳模块,其中包括com.sim:log4j在ear文件中)。
现在,我的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的pOM: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:jar:0.0.1-SNAPSHOT:提供 30/10/12 18:59:22 CET:缺少神器com.sim:log4j:jar:0.0.1-SNAPSHOT:提供
也许包括com.sim.log4j里面的模块(ejb,web等...)会起作用,但我想通过sim-java项目使用传递依赖。
请问怎么做?
奥利弗
答案 0 :(得分:2)
您不能依赖父pom中的com.sim:log4j
。这种依赖关系将在子女中继承,这意味着com.sim:log4j
将依赖于自己。
而是在父pom中创建<dependencyManagement/>
,然后在需要它的孩子中宣布使用com.sim:log4j
,此处为web
和ejb
。
父母:
<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将成为传递依赖项。