Maven内部库pom版本管理

时间:2012-11-20 14:27:11

标签: maven maven-3

是否有任何工具和/或最佳实践可帮助管理许多依赖项目中的大量内部库版本。请允许我详细说明,

假设您有产品A,B,C。 这些产品依赖于库X,Y,Z,并且这些产品也存在依赖关系。

在这个世界中,我们希望将所有版本保留在所有依赖项的最新发布的版本上(除了工作副本之外没有快照依赖项)。这允许我们随时发布产品并强制所有项目在CI(Hudson)中运行。

问题在于保持pom.xml的最新状态。目前,我们使用自定义maven插件,作为每个版本的一部分,在我们的SCM中搜索依赖于正在发布的项目并更新它的pom.xml。这与versions-maven-plugin类似,只是您不需要每个项目的工作副本来执行此操作。

必须有更好的方法。其他团队在许多项目中对许多共享库做了什么?组织这个的最佳方法是什么?在某些情况下,多模块可以工作,但是我们的大多数库都是相当独立的,并且被太多其他项目用于(a)决定它将与哪个多模块相匹配,以及(b)适用于此的层次结构。

2 个答案:

答案 0 :(得分:1)

在Maven中管理依赖关系可以很好地处理依赖管理 - 我认为你熟悉它。您可以将此dependencyManagement外包给专用POM:所谓的BOM POM(请参阅http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)。

在您的情况下,您的产品A,B和C可能共享此BOM POM。由于这一事实,您应该定义一个仅包含此BOM POM的Maven项目,其中包含对第三方软件X,Y和Z的所有依赖关系管理。可以发布此项目,并且您可以通过范围导入添加BOM POM的依赖项。

您的BOM POM:

<project>
   <groupId>com.acme</groupId>
   <artifactId>my-thirdparty-bom-pom</artifactId>
   <version>1.0-SNAPSHOT</version>
   ...
   <dependencyManagement>
     <dependencies>
       <dependency>
         <groupId>...</groupId>
         <artifactId>X</artifactId>
         <version>...</version>
       </dependency>
       <dependency>
         <groupId>...</groupId>
         <artifactId>Y</artifactId>
         <version>...</version>
       </dependency>
       <dependency>
         <groupId>...</groupId>
         <artifactId>Z</artifactId>
         <version>...</version>
       </dependency>
     </dependencies>
   <dependencyManagement>
   ...
</project>

项目A的示例导入

<project>
   ...
   <dependencyManagement>
     <dependencies>
       <dependency>
         <groupId>com.acme</groupId>
         <artifactId>my-thirdparty-bom-pom</artifactId>
         <version>1.0-SNAPSHOT</version>
         <scope>import</scope>
       <dependency>           
     </dependencies>
   <dependencyManagement>

   <dependencies>
     <dependency>
       <groupId>...</groupId>
       <artifactId>Y</artifactId>
       <!-- the version is managed by the thirdparty bom imported above -->
     </dependency>
   </dependencies>
   ...
</project>

答案 1 :(得分:0)

最接近的是使用Dependency Version Ranges然后在个人资料中覆盖您的pom repositories changing snapshots to false,确保在发布期间使用“-P”包含您的个人资料。

<dependency>
  <groupId>a</groupId>
  <artifactId>a</artifactId>
  <version>[3.8,4.0)</version>
</dependency>

...

<profiles>
 <profile>
  <id>your-release</id>
  <repositories>
    <repository>
     ...
     <snapshots>
       <enabled>false</enabled>
     </snapshots>
    </repository>
  </repositories>
 </profile>
<profiles>  

另一种模式是"bom",您可以创建一个pom(包装:pom),声明一个依赖项列表,使管理更容易(更少更改)。