是否有任何工具和/或最佳实践可帮助管理许多依赖项目中的大量内部库版本。请允许我详细说明,
假设您有产品A,B,C。 这些产品依赖于库X,Y,Z,并且这些产品也存在依赖关系。
在这个世界中,我们希望将所有版本保留在所有依赖项的最新发布的版本上(除了工作副本之外没有快照依赖项)。这允许我们随时发布产品并强制所有项目在CI(Hudson)中运行。
问题在于保持pom.xml的最新状态。目前,我们使用自定义maven插件,作为每个版本的一部分,在我们的SCM中搜索依赖于正在发布的项目并更新它的pom.xml。这与versions-maven-plugin类似,只是您不需要每个项目的工作副本来执行此操作。
必须有更好的方法。其他团队在许多项目中对许多共享库做了什么?组织这个的最佳方法是什么?在某些情况下,多模块可以工作,但是我们的大多数库都是相当独立的,并且被太多其他项目用于(a)决定它将与哪个多模块相匹配,以及(b)适用于此的层次结构。
答案 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),声明一个依赖项列表,使管理更容易(更少更改)。