2

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

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

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

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

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

4

2 回答 2

2

在 Maven 中管理依赖项可以很好地与 dependencyManagement 配合使用——我想你对它很熟悉。您可以将此dependencyManagement 外包给专用POM:所谓的BOM POM(请参阅http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)。

在您的情况下,此 BOM POM 可能由您的产品 A、B 和 C 共享。因此,您应该定义一个仅包含此 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>
于 2012-11-20T14:55:43.037 回答
0

最接近的方法是使用依赖版本范围,然后在配置文件中覆盖您的 pom存储库,将快照更改为 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),它声明一个依赖项列表以使管理更容易(更改更少)。

于 2012-11-20T15:02:39.390 回答