maven托管依赖项与声明的依赖项之间存在冲突

时间:2014-08-29 07:46:10

标签: java maven classloader

我正在运行一个Websphere 7项目。 Pom结构如下:

我的项目

<parent>
    <groupId>company</groupId>
    <artifactId>websphere-superpom</artifactId>
    <version>version</version>
</parent>
<dependencies>
    ...
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>2.2.5</version>
    </dependency>
</dependencies>
...

WebSphere的superpom

<dependencies>
    ...
    <dependency>
        <groupId>com.ibm.websphere</groupId>
        <artifactId>runtime-dependencies</artifactId>
        <version>version</version>
        <type>pom</type>
        <scope>provided</scope>
    </dependency>
</dependencies>

运行时间的依赖关系

<dependencies>
    ...
    <dependency>
        <groupId>com.ibm.websphere</groupId>
        <artifactId>j2ee</artifactId>
        <version>version</version>
    </dependency>
</dependencies>

神器j2ee包含几个包,其中还有javax.el,它在我在项目的pom中声明之前加载。

我使用选项-verbose:class运行JUnit测试,输出确认了这个问题。

[Loaded javax.el.ExpressionFactory from file:/C:/Program Files (x86)/IBM/SDP/runtimes/base_v7/lib/j2ee.jar]

然后我在Maven控制台中运行以下命令:

mvn dependency:analyze -DcheckDuplicateClasses

我得到的输出是:

[WARNING] Unused declared dependencies found:
...
[WARNING]    javax.el:javax.el-api:jar:2.2.5:compile
...

如何告诉Maven从我在项目的pom中声明的库中加载ExpressionFactory?我无法更改websphere-superpom,因为它是公司管理的工件。

编辑: 正如我所说的那样,我试图在我的项目的pom中重新宣布违规依赖:

<dependency>
    <groupId>com.ibm.websphere</groupId>
    <artifactId>runtime-dependencies</artifactId>
    <version>version</version>
    <exclusions>
        <exclusion>
            <groupId>com.ibm.websphere</groupId>
            <artifactId>j2ee</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后Maven告诉我:

Could not resolve dependencies for project ....: Failure to find com.ibm.websphere:runtime-dependencies:jar in nexus url

1 个答案:

答案 0 :(得分:0)

如果您可以修改父依赖项,则可以使用maven exclusions

在websphere-superpom中:

<dependency>
    <groupId>com.ibm.websphere</groupId>
    <artifactId>runtime-dependencies</artifactId>
    <version>version</version>
    <type>pom</type>
    <scope>provided</scope>
    <exclusions>
        <exclusion>
          <groupId>javax.el</groupId>
          <artifactId>javax.el-api</artifactId>
        </exclusion>
    </exclusions> 
</dependency>

修改
如果您使用了水的建议,请不要忘记将此运行时依赖性的范围设置为提供。因为现在Maven试图在你的nexus repo中搜索它。