使用Maven的传递依赖和排除

时间:2012-10-30 18:06:02

标签: maven

我有这个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项目使用传递依赖。

请问怎么做?

奥利弗

1 个答案:

答案 0 :(得分:2)

您不能依赖父pom中的com.sim:log4j。这种依赖关系将在子女中继承,这意味着com.sim:log4j将依赖于自己。

而是在父pom中创建<dependencyManagement/>,然后在需要它的孩子中宣布使用com.sim:log4j,此处为webejb

父母:

<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将成为传递依赖项。