对Maven使用可传递依赖项和排除项
我有一个专业的等级制度:对Maven使用可传递依赖项和排除项,maven,Maven,我有一个专业的等级制度: sim-java ejb web log4j ... ejb、web和log4j是sim java的模块,每个模块都通过父标记引用sim java 我想创建一个log4j模块,并将其作为依赖项包含在simjava中,这样log4j将作为依赖项出现在ejb和web模块中 基本上,sim java中的my pom.xml包含以下内容: <dependencies> <dependency> <g
sim-java
ejb
web
log4j
...
ejb、web和log4j是sim java的模块,每个模块都通过父标记引用sim java
我想创建一个log4j模块,并将其作为依赖项包含在simjava中,这样log4j将作为依赖项出现在ejb和web模块中
基本上,sim java中的my pom.xml包含以下内容:
<dependencies>
<dependency>
<groupId>com.sim</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
com.sim
log4j
${log4j.version}
假如
(提供范围是因为我有一个ear模块,它将在ear文件中包含com.sim:log4j)
现在,log4j模块中的pom.xml是:
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
log4j
log4j
1.2.17
我有以下生成错误:
12月30日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>
com.sim
模拟java
0.0.1-快照
com.sim
log4j
log4j
log4j
1.2.17
2012年10月30日18:59:22 CET:[警告]com.sim:log4j:jar:0.0.1-SNAPSHOT的POM丢失,没有可用的依赖项信息
2012年10月30日18:59:22 CET:缺少工件com.sim:log4j:jar:0.0.1-快照:已提供
2012年10月30日18:59:22 CET:缺少工件com.sim:log4j:jar:0.0.1-快照:已提供
2012年10月30日18:59:22 CET:缺少工件com.sim:log4j:jar:0.0.1-快照:已提供
也许在模块(ejb、web等)中包含com.sim.log4j会起作用,但我想通过SimJava项目使用可传递的依赖关系
请问怎么做
Olivier您不能在父pom中依赖于
com.sim:log4j
。这种依赖关系将在子项中继承,这意味着com.sim:log4j
将依赖于自身
相反,在父pom中创建一个
,然后在需要它的子pom中声明使用com.sim:log4j
,这里是web
和ejb
父pom:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.sim</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
com.sim
log4j
${log4j.version}
假如
Web和Ejb pom:
<dependencies>
<dependency>
<groupId>com.sim</groupId>
<artifactId>log4j</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
com.sim
log4j
假如
编辑
通过只依赖ejb项目中的log4j模块,您仍然可以拥有可传递的依赖关系。然后,web项目将依赖于ejb项目,而log4j将是一个可传递的依赖项。好的,我怀疑这种行为。这意味着我必须在所有模块中手动包含依赖项?ThxI增加了一个编辑部分。我怀疑您的web模块依赖于ejb模块。因此,如果ejb模块依赖于log4j模块,那么它将是web模块中的一个可传递依赖。感谢您的编辑,我现在已经很好地理解了依赖关系。当做