2015-04-06 76 views
22

最近我一直在研究一些前一段时间开发的项目的一些改进,这就是我发现的。很多pom文件中的依赖关系都没有指定版本,但它们已解决。该项目由1个根模块和2个子模块组成。使用聚合器模式,这意味着根本没有dependencyManagement部分。较高级的项目只需要汇总两个模块,这就是它的全部功能。子项目不会将其称为父项。他们有不同的父母。我无法理解的是,子项目本身和它们的父项(事实上它也没有依赖项管理)都没有指定某些依赖项的版本。例如:没有版本的maven dependency

<dependency> 
    <groupId>javax.mail</groupId> 
    <artifactId>javax.mail-api</artifactId> 
</dependency> 
<dependency> 
    <groupId>com.sun.mail</groupId> 
    <artifactId>javax.mail</artifactId> 
</dependency> 
<dependency> 
    <groupId>com.sun.mail</groupId> 
    <artifactId>imap</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jul-to-slf4j</artifactId> 
</dependency> 
<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-classic</artifactId> 
</dependency> 

有人可以帮我弄清楚这一点吗?似乎maven处理一些默认策略的版本控制。

+0

您能显示'mvn -version'输出吗? –

+2

没有定义工件的版本,maven工作是不可能的。它们应该在子模块或父代中的'dependencyManagement'标签中的某处定义。请检查您的pom层次结构。使用mvn help:effective-pom – Ozgen

+1

您是否已通过'mvn help:effective-pom -Doutput = result.xml'进行检查,并检查是否没有dependencyManagement。 – khmarbaise

回答

18

好的,我想我会自己回答。当然,我查看了依赖关系:树,但是我提到了树的第一级成员的所有依赖关系。我没有马上注意到了,就是dependencyManagement不存在于父,但它是在子模块但是现在,什么是更有趣的它包含:

 <dependency> 
      <groupId>io.spring.platform</groupId> 
      <artifactId>platform-bom</artifactId> 
      <version>1.0.2.RELEASE</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 

我从来没有使用过Spring IO平台之前,所以对我来说这是一个全新的概念。事实证明,该平台包含相当多的预先配置的依赖关系: http://docs.spring.io/platform/docs/current/reference/htmlsingle/#appendix-dependency-versions

+1

这不是Spring相关的,但maven BOM“材料清单”模式,用于定义使用某些库所需的依赖关系。参见[Maven依赖机制](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html) – estani

13

没有定义工件的版本,maven工作是不可能的。它们应该在子模块或父模块的dependencyManagement标记中的某处定义。请检查您的pom层次结构。在项目的子模块目录中使用mvn help:effective-pom。您也可以使用mvn dependency:tree以查明哪些工件以及完整的工件信息(包括版本号)在依赖关系管理的结果中得到解决。

相关问题