Maven插件用于项目语义化版本控制。

7

我正在寻找一个Maven插件,它可以帮助我管理在我们CI环境中进行的每个构建的版本名称和代码。该插件可以将前缀附加到主版本代码上,甚至更新它(而不会更改pom.xml)。例如:

project version: 2.0.1
git/svn revision: 2342334

jar output: name-2.0.1-2342334.jar
maven repo: ../path/to/local/maven/repo/<package path>/2.0.1-2342334/

此插件的主要要求如下:
  • 必须在Maven存储库中(这意味着在我的pom.xml中添加此插件并运行Maven时无需进行其他设置)
  • 每次应用此插件时不能编辑pom
  • 最好有一个配置文件,这样我就可以管理版本控制过程
  • 必须能够编辑输出文件元数据(因此版本将被应用,就好像它是在pom.xml文件中第一次编写的)
到目前为止,我只发现了maven-buildmetadata-pluging,但不幸的是它不在Maven Repo中,所以我陷入了困境。任何帮助都将是非常感激的。
4个回答

2
如果更改构件的版本,则必须更新POM文件,否则无法重现此次更改。
如果在构建过程中更改了某些内容(例如添加版本等),则必须在POM文件中进行反映。否则,无法使用相同结果重现构建过程。
您写下了不更改POM文件而是维护单独的文件。因此问题是:为什么不直接使用POM文件呢?因为它恰好是为此目的而设计的。
此外,使用现有的Maven插件(如build-helper-maven-plugin、buildnumber-maven-plugin)即可实现您所提到的所有信息。
使用buildnumber-maven-plugin可以使用SCM信息,它提供了类似于SCM修订号(SVN或GIT哈希)的信息。

另一方面,如果您不想手动更改pom文件,则可以使用versions-maven-pluginmaven-release-plugin,这些插件可以自动更改pom文件中的信息并自动处理所有这些事情。

为了在生成的工件中保留元数据,您可以像这样配置所有插件(如ear、war、jar)等,其中buildNumber来自于buildnumber-maven-plugin:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>${maven-jar-plugin.version}</version>
      <configuration>
        <archive>
          <addMavenDescriptor>true</addMavenDescriptor>
          <index>true</index>
          <manifest>
            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
          </manifest>
          <manifestEntries>
            <artifactId>${project.artifactId}</artifactId>
            <groupId>${project.groupId}</groupId>
            <version>${project.version}</version>
            <buildNumber>${buildNumber}</buildNumber>
          </manifestEntries>
        </archive>
      </configuration>
    </plugin>

当然,如果你真的喜欢使用Maven,那么你应该使用像Artifactory或Nexus这样的仓库管理器,它们可以使生活更加轻松。

1
托管自己的maven存储库非常容易,可以使用NexusArtifactory。您还可以使用Artifactory云版本(我与他们没有关联...),因此它可能解决了您的问题。顺便说一句 - 使用Apache的简单服务器也可以完成此操作,但需要更多的工作...
关于插件:如果部署快照应用程序,则每个应用程序都基于时间戳获得自己的版本。
对于发布,另一个选项是运行svn info并将结果(或其一部分)放入生成的工件中。然后可以通过代码访问信息。

谢谢您的回答,但问题不在设置Nexus或其他任何目的上。问题在于一个项目可能有多个构建环境。例如,客户端可以在他的一侧构建整个应用程序。但我没有(也不能有)访问所有这些构建环境。这就是为什么需要全局Maven存储库的原因。 - Serj Lotutovici
你应该使用自定义属性来标记不同的构件。例如,在使用Artifactory时,你可以在Maven部署期间附加属性 - JBaruch

0

我只是想补充一下(虽然这个问题已经五年了,而且已经有一个被接受的答案),Buildmetadata Maven Plugin 最初并没有在 Maven Repo 上可用,但现在已经可以使用了(自 2013 年末以来)。想要尝试的人可以在以下位置找到该工件:

  1. com.redhat.rcm.maven.plugin:buildmetadata-maven-plugin
  2. de.smartics.maven.plugin:buildmetadata-maven-plugin
请注意,由于命名约定的原因,名称已从maven-buildmetadata-plugin更改为buildmetadata-maven-plugin。
我是smartics公司这个插件的“原始”作者之一。如果您想使用它,您可能会想使用Red Hat提供的分支。据我所知,这两个版本并没有太大的区别,而且它们自发布以来就没有同步过,因为还有很多其他事情要做,而且该插件似乎功能稳定。;-)
这两个版本的源代码也可在GitHub上找到:
  1. release-engineering/buildmetadata-maven-plugin
  2. smartics/buildmetadata-maven-plugin

-1

如前所述,您需要更改pom中的版本。一种与发布插件结合使用的方法是:

mvn \
  se.bjurr.gitchangelog:git-changelog-maven-plugin:VERSION_HERE:semantic-version \
  release:prepare release:perform

使用Git Changelog Maven Plugin


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接