需要控制多个项目的Maven版本号

时间:2015-06-03 18:51:25

标签: maven versioning release-management

这是一个很长的故事。我目前的地方使用Ant进行构建。他们创建了大约20个不同的基础类罐,用于多个项目。最初,这些项目会检查他们所需的各种罐子的特定版本,然后再也不会更新它们。这意味着每个应用程序都有与其他项目和我们的服务器不兼容的jar。接踵而来。

为了解决这个问题,我立即引入了一个Maven存储库,并将Ivy集成到我们的Ant构建中。不再检查罐子。相反,您从Maven存储库中获取正确的版本。最初,我希望开发人员保持ivy.xml版本号的最新版本,但他们从未这样做过。相反,Ivy集成和设置依赖于外部Subversion项目。这使我能够将Ivy与旧build.xml文件的最小更改集成在一起。我在该外部常春藤项目中添加了一个ivy.version.properties文件,并在那里维护各种罐子的版本号。有一个企业范围的版本号。

各种项目使用${corporate.version}属性作为基础jar版本号。当我更新ivy.version.properties文件时,所有项目都会使用正确的基础类版本号进行更新。我们使用<ivy:makepom>为我们的项目生成pom.xml,并使用它将我们的罐子和战争部署到我们的Maven存储库中。

结果:我不再需要担心开发人员保持项目版本号同步。我作为发布工程师通过更新那个ivy.version.properties文件来处理它。所有项目都是同步的。

现在,我们正在转向Maven,我希望能够做同样的事情。我怀疑开发人员会记得用正确的版本号更新他们的pom.xml,所以我想从另一个文件中读取它,并使用它。

有两个问题:一个是Maven在执行任何目标之前首先读取项目的版本号。 pom.xml中没有版本号,生成的jar没有版本号。

即使我设法完成第一步,我们也知道pom.xml中没有用于基础类的版本号。当Maven下拉pom.xml以获取依赖项时,它无法确定哪个版本。

是的,我可以将其放入公司pom.xml并将其作为所有其他项目的父项目。我们已经有一个父项目来帮助设置所有项目的各个方面。我可以在那里放一个基础类版本号。但是,这意味着开发人员现在必须更新每个版本的父项目的版本号。如果开发人员无法信任每个版本更新项目的版本号,那么是什么让您认为他们会为每个版本的父版本做到这一点?

我知道其他人一定遇到过类似的问题。你怎么处理这个?

我可以使用Ant脚本从模板pom.xml生成pom.xml,但这看起来有点傻。

我想知道Maven是否可以动态生成pom.xml然后使用它来继续执行正确的目标。例如,我输入mvn package,Maven将获取template.pom.xml文件,填写缺失的版本号以生成generated.pom.xml文件,然后对生成的mvn package执行import UIKit import SpriteKit class GameViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let scene = GameScene(size: CGSize(width: 1024, height: 768)) // Configure the view. let skView = self.view as! SKView skView.showsFPS = true skView.showsNodeCount = true /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = true /* Set the scale mode to scale to fit the window */ scene.scaleMode = .AspectFill skView.presentScene(scene) } override func prefersStatusBarHidden() -> Bool { return true } } POM。

或者,有没有更好的方法来解决这个问题?基本上,我需要控制所有项目中版本的版本号。这样,所有项目都使用相同版本的基础类。此外,我通过这种方式控制其他jar的其他版本(如log4j)。我和Ant和Ivy一起完成了这个,现在我想转移到Maven。

4 个答案:

答案 0 :(得分:0)

我认为最好的选择是创建一个包含所有依赖项的pom.xml,然后使用import导入它在开发人员项目paren pom.xml中

所以,在项目父POM中:

<properties>
  <corporate.version>...</corporate.version>
<properties>
...
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.mycompany.libs</groupId>
      <artifactId>foundation<artifactId>
      <version>${corporate.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    ...
  </dependencies>
</dependencyManagement>

因此,对于新的基础库集,您将部署一个包含所有版本的新pom.xml,并更新相关父pom.xml文件中的${corporate.version}。您甚至可以在版本尚未修复时使用这些版本号定义-SNAPSHOT工件。

有关详细信息,请参阅:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Importing_Dependencies

答案 1 :(得分:0)

我们实际上遇到了同样的问题而且我知道从不更新他们的poms和稳定性方面的“懒惰程序员”之间存在权衡:“突然”更改基础罐的版本可能会导致意外构建失败。

如果您真的想要您描述的行为,我会将所需的依赖项放入SNAPSHOT pom中,并将其用作父pom或将其作为BOM导入。通过这种方式,您可以更改内容,并且每个人都会在下次更新时提取新内容。

答案 2 :(得分:0)

我认为这是一个愚蠢的想法,而且永远不应该做。开发人员有责任更新他们自己该死的POM,并确保他们正在提取正确的版本。这是它应该的方式,开发人员应该只是学会这样做(技术术语是什么?...哦,是的) 正确的方式

我最初实现这个是因为公司有类似的东西(这不起作用)而且我在让开发人员做他们应该做的工作时遇到了问题。并且,开发人员喜欢它,因为当出现问题而不是他们时,我现在正式负责。这是你做别人工作时得到的。

我已经说服公司停止尝试保留我们所有核心罐(我们其他项目中使用的罐子)和我们的版本号相同的版本。相反,每个项目都有自己的版本。只有当实际发生变化时,Jars才会发布版本,而不是当我们强制升级到版本时。而且,开发人员必须知道他们所依赖的各种罐子的版本。

答案 3 :(得分:0)

使用maven-release-plugin。该插件可以在所有pom.xml文件上标记版本号。该插件还了解版本控制,并且知道如何标记Maven项目以进行发布(或分支)。