【问题标题】:Use transitive dependencies and exclusions with Maven在 Maven 中使用传递依赖项和排除项
【发布时间】:2012-10-20 03:38:41
【问题描述】:

我有这个 maven 层次结构:

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>

(提供范围是因为我有一个 ear 模块,它将在 ear 文件中包含 com.sim:log4j)。

现在,我的 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-快照

我认为有一些依赖问题,因为 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:[警告] com.sim:log4j:jar:0.0.1-SNAPSHOT 的 POM 丢失,没有可用的依赖信息 30/10/12 18:59:22 CET:缺少工件 com.sim:log4j:jar:0.0.1-SNAPSHOT:provided 30/10/12 18:59:22 CET:缺少工件 com.sim:log4j:jar:0.0.1-SNAPSHOT:provided 30/10/12 18:59:22 CET:缺少工件 com.sim:log4j:jar:0.0.1-SNAPSHOT:provided

也许在模块(ejb、web 等)中包含 com.sim.log4j 会起作用,但我想通过 sim-java 项目使用传递依赖。

请问这个怎么做?

奥利维尔

【问题讨论】:

    标签: maven


    【解决方案1】:

    您不能在父 pom 中依赖 com.sim:log4j。该依赖将在子代中继承,这意味着 com.sim:log4j 将依赖于自身。

    而是在父 pom 中创建一个&lt;dependencyManagement/&gt;,然后在需要它的孩子中声明使用com.sim:log4j,这里是webejb

    父 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 将是一个传递依赖。

    【讨论】:

    • 好的,我怀疑这种行为。这意味着我必须在所有模块中手动包含依赖项?谢谢
    • 我添加了一个编辑部分。我怀疑你的 web 模块依赖于 ejb 模块。因此,如果 ejb 模块依赖于 log4j 模块,它将是 web 模块中的传递依赖。
    • 感谢您的编辑,我现在很好地理解了依赖关系。问候
    猜你喜欢
    • 2013-04-27
    • 2022-11-30
    • 2018-07-06
    • 2012-02-25
    • 2021-10-24
    • 1970-01-01
    • 2013-02-17
    • 2019-10-29
    相关资源
    最近更新 更多