清理Maven依赖管理

时间:2011-06-08 15:36:13

标签: java maven dependencies pom.xml

在一个大型Maven 2项目中,让依赖关系管理确保在整个系统中只使用一个依赖项版本是很好的。这使得系统保持一致。

但是当我生成有效的POM时,我没有机会看到依赖版本的来源。同样在层次结构顶部的POM中,我不知道在子POM中确实使用了依赖关系管理部分的定义版本。

那么如何清理依赖关系管理呢?当我删除一个项目中的依赖项时,我总是检查所有其他项目是否仍然需要它,以便我也可以从顶部的依赖项管理中删除?

另外,如何构建依赖关系管理,确保它不会在子POM中的某处复制?当我添加依赖项时,我总是检查所有其他项目,看它是否可能在依赖项管理中聚合在一起?或者你是否总是将所有依赖版本从头开始移动到顶部,这样它们总是只在一个地方?

感谢您的任何想法。

4 个答案:

答案 0 :(得分:9)

您可以为项目创建一个或多个boms(物料清单)。这些pom.xmls将在dependencyManagement部分中声明项目中使用的所有依赖项。

在每个子pom中,您将导入这些boms并使用项目所需的依赖项。

通过这种方式,依赖版本可以集中管理,同时,每个子pom只使用它所需的依赖项。

请参阅Importing Managed Dependencies

BOM项目

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>my.group</groupId>
  <artifactId>My-Project-Bom</artifactId>
  <version>1.0</version>
  <packaging>pom</packaging>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.7.0</version>
      </dependency>
      ...
    </dependencies>
  </dependencyManagement>
</project>

儿童项目

<project>  
 <modelVersion>4.0.0</modelVersion>
 <groupId>my.group</groupId>
 <artifactId>child1</artifactId>
 <packaging>jar</packaging>
 <name>Child1</name>
 <version>1.0</version>
 <dependencyManagement>
   <dependencies>
     <dependency>
       <groupId>my.group</groupId>
       <artifactId>My-Project-BOM</artifactId>
       <version>1.0</version>
       <type>pom</type>
       <scope>import</scope>
     </dependency>
  </dependencies>
 </dependencyManagement>
 <dependencies>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
   </dependency>
 </dependencies>
 ...
</project>

maven dependency plugin有一些目标可以帮助您获得依赖关系层次结构。

mvn dependency:list
mvn dependency:tree
mvn dependency:analyze

答案 1 :(得分:2)

如果您正在使用eclipse,m2eclipe插件允许您为您的pom查看依赖关系层次结构。在尝试确定将依赖项引入项目的位置以及发生冲突的位置时,这非常有用。

答案 2 :(得分:1)

除非在所有项目中使用,否则应该在使用它们的项目中显式声明依赖项。例如,如果将Spring用于所有项目,则将其放在父POM中。如果它仅在某些项目中使用,则在每个项目中声明它并在父项中放置一个spring.version属性,每个子pom可以将其用于其版本。

将所有依赖项移动到父项会从每个项目中删除责任以管理其自己的依赖项。我认为这是滥用maven,因为它使维护更加困难而不是更容易。它现在将依赖项添加到不需要它们的项目中。对于项目,依赖项的范围通常也是不同的,除非您在本地声明依赖项,否则无法管理它。

答案 3 :(得分:0)

您可以使用Structure101 composition perspective获取POM到POM的依赖关系以及导致它们的代码引用。创建一个新的s101项目,输入Maven,指定根pom.xml文件,完成(使用向导其余部分的默认值),然后选择合成透视图(UI左上方垂直工具栏上的第二个按钮)和你会看到这样的事情:

Structure101 POM dependency graph