我正在使用Maven 3构建一个包含3层的java应用程序 - server,ejb和ui。 EJB项目依赖于Server项目,UI项目仅依赖于EJB,并且提供了Server传递依赖项的排除。
当UI项目构建为战争时,尽管没有出现依赖关系:树命令,但仍包含服务器依赖项。
以下是运行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
这是运行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
对Server的依赖是两棵树之间的唯一区别。 这两个输出不应该一样吗?什么可能导致包含未显示依赖的库:树?
父POM将模块定义为:
<modules>
<module>Server</module>
<module>EJB</module>
<module>UI</module>
</modules>
EJB POM中列出的依赖项是:
<dependencies>
<dependency>
<groupId>project.name</groupId>
<artifactId>Server</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
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>
我知道我可以明确地排除服务器jar包含在WAR中,但我更愿意解决实际问题。
答案 0 :(得分:3)
在两种情况下,输出应该相同是对的。然而,Maven 3转而使用Aether进行依赖解析,但截至目前依赖:树使用旧的依赖解析机制,这就是差异的原因。有关详细信息,请查看以下链接。
由于这个原因,你应该只依赖mvn clean install -X的输出来进行依赖管理。
修改强>
从Maven Dependency Plugin 2.5版开始,dependency:tree
也使用Aether(参见bug report和release notes)
答案 1 :(得分:1)
正如我们在评论中指出的那样,问题的来源是错误的Maven 3.0.3。 3.0.4版解决了这个问题。
我在那里发表评论:
你使用哪种Maven版本?如果不是3.0.4,请尝试并告诉它是否有帮助。在使用以前的Maven 3版本时,我发现了非常糟糕的问题,主要是使用3.0.2。