Maven构建与依赖树不同

J B*_*lay 7 java maven

我正在使用Maven 3构建一个包含3层的java应用程序 - server,ejb和ui.EJB项目依赖于Server项目,UI项目仅依赖于EJB,并提供Server传递依赖项的排除.

当UI项目构建为战争时,尽管没有出现依赖:tree命令,但仍包含服务器依赖项.

这是运行的相关输出 mvn dependency:tree

**project.name:UI:war:1.0 SNAPSHOT**
+-  project.name:Common:jar:1.0 SNAPSHOT:compile
|   +  org_common:_lib:jar:16.0.006:compile
|   |  +- log4j:log4j:jar:1.2.16:compile
|   |  \- commons configuration:commons configuration:jar:1.6:compile
|   |     +- commons lang:commons lang:jar:2.4:compile
|   |     +- commons digester:commons digester:jar:1.8:compile
|   |     \- commons beanutils:commons beanutils core:jar:1.8.0:compile
|   +- org_common:_security_lib:jar:16.0.006:compile
|   \- org.springframework:spring:jar:2.0:compile
+-  **project.name:EJB:ejb client:client:1.0 SNAPSHOT:compile**
|   \- com.ibm.websphere.appserver:j2ee:jar:7.0.0.9:compile
+-  org_common:_uicomponent:jar:16.0.006:compile
Run Code Online (Sandbox Code Playgroud)

这是运行时的输出依赖树 mvn clean install -X

**project.name:UI:war:1.0 SNAPSHOT**
+-  project.name:Common:jar:1.0 SNAPSHOT:compile
|   +  org_common:_lib:jar:16.0.006:compile
|   |  +- log4j:log4j:jar:1.2.16:compile
|   |  \- commons configuration:commons configuration:jar:1.6:compile
|   |     +- commons lang:commons lang:jar:2.4:compile
|   |     +- commons digester:commons digester:jar:1.8:compile
|   |     \- commons beanutils:commons beanutils core:jar:1.8.0:compile
|   +- org_common:_security_lib:jar:16.0.006:compile
|   \- org.springframework:spring:jar:2.0:compile
+-  **project.name:EJB:ejb client:client:1.0 SNAPSHOT:compile**
|   +- **project.name:Server:jar:1.0 SNAPSHOT:compile**
|   |   +- javassist:javassist:jar:3.4.GA:compile
|   |   +- project.filestore:filestore_client:jar:7.0.003:compile
|   |   +- com.ibm.db2:db2jcc:jar:9.7.fp1.aix64.s091114:compile
|   |   +- com.ibm.db2:db2java:jar:9.7.fp1.aix64.s091114:compile
|   |   +- com.ibm.db2:db2jcc_license_cu:jar:9.7.fp1.aix64.s091114:compile
|   \- com.ibm.websphere.appserver:j2ee:jar:7.0.0.9:compile
+-  org_common:_uicomponent:jar:16.0.006:compile
Run Code Online (Sandbox Code Playgroud)

对Server的依赖是两棵树之间的唯一区别.这两个输出不应该一样吗?什么可能导致包含的库不依赖于:树?

父POM将模块定义为:

<modules>
    <module>Server</module>
    <module>EJB</module>
    <module>UI</module>
</modules>
Run Code Online (Sandbox Code Playgroud)

EJB POM中列出的依赖关系是:

<dependencies>
        <dependency>
            <groupId>project.name</groupId>
            <artifactId>Server</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
Run Code Online (Sandbox Code Playgroud)

UI中的依赖关系是:

<dependencies>
        <dependency>
            <groupId>project.name</groupId>
            <artifactId>EJB</artifactId>
            <version>${project.version}</version>
            <type>ejb-client</type>
            <exclusions>
                <exclusion>
                    <groupId>project.name</groupId>
                    <artifactId>Server</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

我知道我可以明确地排除服务器jar包含在WAR中,但我更愿意解决实际问题.

小智 5

你是对的,两种情况下的输出应该是相同的。然而,Maven 3 转向使用 Aether 进行依赖关系解析,但现在 dependency:tree 使用旧的依赖关系解析机制,这就是差异的原因。查看以下链接了解详细信息。

https://cwiki.apache.org/MAVEN/maven-3x-compatibility-notes.html#Maven3.xCompatibilityNotes-DependencyResolution

因此,您应该仅依赖 mvn clean install -X 的输出进行依赖项管理。

编辑

从 Maven Dependency Plugin 2.5 版本开始,dependency:tree也使用 Aether(请参阅错误报告发行说明


Mic*_*ski 1

正如我们在评论中指出的,问题的根源是有缺陷的 Maven 3.0.3。3.0.4版本已经解决了这个问题。

我的评论是:

您使用哪个确切的 Maven 版本?如果不是 3.0.4,请尝试一下并看看是否有帮助。我在使用以前的 Maven 3 版本(主要是 3.0.2)时发现了非常非常糟糕的问题。