【问题标题】:Clean up Maven dependency management清理 Maven 依赖管理
【发布时间】:2011-09-11 00:07:40
【问题描述】:

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

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

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

另外,我如何建立依赖管理,确保它不会在子 POM 的某个地方重复?当我添加依赖项时,我总是检查所有其他项目,看看它是否可以在依赖项管理中聚合到顶部?或者您是否总是将所有依赖版本从一开始就移到顶部,以便它们始终只在一个位置?

感谢您的任何想法。

【问题讨论】:

  • 我刚刚想到的另一个想法:为什么不在所有模块中使用相同的版本号,并尽可能多地依赖 ${project.version}。理想情况下,我只有顶部 POM 中的版本号,并在其他任何地方使用该变量。像这样我根本不需要依赖管理,所有内部依赖版本都是直接用变量指定的。

标签: java maven dependencies pom.xml


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我看不出在依赖管理或属性中指定版本之间的区别。不将依赖项移动到父依赖项管理的缺点是会将版本号分散到整个 POM 中,很容易导致整个应用程序中存在一个依赖项的多个版本。
    • 这就是你使用属性的原因。然后,您的依赖项在项目本地进行管理,但该属性定义了要使用的接受版本。唯一需要注意的是,任何添加到子 pom 的人都必须意识到这些属性的存在并适当地使用它们。这仍然比您的建议更可取,即基本上为每个项目的所有依赖项提供每个其他项目的依赖项。它还几乎迫使您将它们全部作为编译范围。
    【解决方案3】:

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

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

    这样,依赖版本被集中管理,同时每个子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
    

    【讨论】:

    • 好主意,我不知道。但是由于我们有一个所有其他 POM 都是其子级的顶级 POM,所以我可以在那里使用依赖管理。我仍然不明白这将如何解决清理依赖管理的问题。 BOM 中的问题也是一样的。
    • 从来不知道这种方法。我喜欢它,因为它使您可以控制版本控制,但依赖关系仍然在需要它们的地方以适当的范围声明。如果需要,也易于使用特定版本。
    • 让我们更进一步:我想要一个带有一些 Spring 组件和特定版本的 POM。有没有办法在动态上做到这一点?即在子项目中,使用子项目中定义的版本导入 bom 项目。我在这里有一个类似的问题stackoverflow.com/questions/19156474/…
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2021-07-11
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多