场景:系统具有多个组件,每个组件都有自己的POM。有一些长依赖链(A取决于B取决于C等)。我希望每个“非开发人员 - 桌面”构建成为潜在的候选版本 - 如果它通过QA,我们将部署它而不重建。换句话说,我从来不想将SNAPSHOT版本构建为我定期安排的版本的一部分,只有1.3.0.5,1.3.0.6等版本。我还希望让开发人员能够同时处理多个组件。
预防一些预期的建议:Maven Release Plugin对我没有帮助......除非有一些神奇的方法我可以让我的依赖版本不是POM中的SNAPSHOT,但仍然允许开发人员在多个组件上工作一旦?
我们应该如何在我们所有的POM中管理项目和依赖版本?现在它只是SNAPSHOTs到处都是,这使开发人员的事情变得简单(他们从SNAPSHOT开始,从不关心自己还要别的吗)。但是在部署时令人担忧(使用SNAPSHOT依赖的构建没有明确定义,也不可重现)。
我希望避免在构建时过度玩杂耍,但是现在我看不到任何方法。
我有开发团队在开发APP和UI,他们有时需要对某些依赖项(甚至是util)进行更改/添加,以便启用它们当前的工作。如何查看每个组件的签入POM和依赖版本?
编辑:我更新了标题以引用Maven 2而不是2.0,因为很明显我需要使用2.1或更高版本才能最好地解决这个问题。
答案 0 :(得分:3)
尝试布置构建,以便需要一起开发的模块一起发布。这将让maven发布插件为您完成大部分工作。
对于真正应该具有单独生命周期的依赖项...因为它们不经常更改或由多个项目共享,所以您希望以不同方式处理它们。我这样做的方法是将依赖关系保留在最后一个发行版本,直到更改实际上需要升级到下一个快照。通过这种方式,当您去发布产品时,您会发现只需按照快照路径即可发布的所有内容。
我发现在项目的顶部pom中将外部依赖项版本指定为属性也很有帮助。这样可以一目了然地查看需要发布的内容。寻找Nexus pom的一个例子。
答案 1 :(得分:1)
这是我发现maven和内部项目非常困难的事情;你有两个版本控制系统(maven's,坦率地说,不是很好)和你的源代码控制(假设它是CVS或更好,支持真正的工作流程)。
以下是我们的工作方式:
report --depends on--> core
web --depends on--> core
我们使用maven release plug:
报告的pom,在开发过程中,将有一个SNAPSHOT版本与核心的pom相匹配。我在核心中执行mvn clean install
,然后我可以在本地环境中的report
中看到这些更改。
当我发布报告时,我必须首先通过maven发布插件发布核心。当我在核心上使用它时,它要求我设置要释放的核心版本(即删除-SNAPSHOT),我说是,并且生成的已发布工件不依赖于SNAPSHOT版本。当发布插件完成后,报告pom现在取决于核心的下一个SNAPSHOT版本(尽管如果你愿意,你可以在mvn release:prepare
期间覆盖它)。
答案 2 :(得分:0)
这与需要分支他们正在处理的代码的人实际上是同一个问题。您需要某种形式的标识符才能获得特定版本,直到您合并回该组件的主线开发。
dependency classifier可能是值得研究的事情。您仍然需要让开发人员正确识别他们修改过的代码。
答案 3 :(得分:0)
我们使用“Super Parent”.pom-project,其中版本定义为属性,并且在每个child.project中,版本都使用这些属性设置
此外,真实项目没有设置版本,而是从父pom项目(包括groupId等)继承它。
通过此设置,版本仅在某些父pom项目中定义,因此所需的设置最小化
e.g。这个结构
等
只有您看到的版本是父关系中的版本 例如:
<modelVersion>4.0.0</modelVersion> <artifactId>foo-bar-foo</artifactId> <packaging>jar</packaging> <name>whatever</name> <description>...</description> <parent> <groupId>org.foo.bar</groupId> <artifactId>persistence-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>foo-bar</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>foo-bar</artifactId> <version>${project.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>org.springframework.jdbc</artifactId> <version>${parent.spring.version}</version> </dependency>
它以这种方式工作,因为在pom中你可以使用已定义的值,如版本,即使版本是通过继承设置的
我们将其与父项目中的模块设置相结合,以使构建更容易