1

我有这个 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 丢失,没有可用的依赖信息 2012 年 30 月 10 日 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 项目使用传递依赖。

请问这个怎么做?

奥利维尔

4

1 回答 1

2

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

而是在父 pom 中创建 a <dependencyManagement/>,然后com.sim:log4j在需要它的孩子中声明使用 of ,这里是weband ejb

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

于 2012-10-30T18:44:36.853 回答