maven - 从属性文件中读取版本号

Posted

技术标签:

【中文标题】maven - 从属性文件中读取版本号【英文标题】:maven - read version number from property file 【发布时间】:2012-01-22 09:40:01 【问题描述】:

我正在尝试从文本文件中读取我的构建版本号,然后将其分配给生成的包名称:myRelease-1.1.1.apk 其中构建号手动设置到属性文件中 版本号=1.1.1 如何通过属性文件中的一个重载在 pom.xml 中设置的 $version.number?

编辑:有关该项目的更多详细信息 .我使用 git 提交属性文件,然后 Jenkins 接管并使用 Maven 构建。我想最终构建一个“myBuild-9.9.9.apk”。现在我有“myBuild-1.1.2.apk” 在 extras/version.properties 中

project.version=9.9.9  

在 pom.xml 中

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
            .....
            <version>1.1.2</version>
      </parent>

      <groupId>ca.lapresse.android</groupId>
      <artifactId>lapresse-hockey-app</artifactId>
      <packaging>apk</packaging>
      <name>La Presse Hockey - App</name>
      <version>1.1.2</version>

…… $project.artifactId 似乎从&lt;version&gt;&lt;/version&gt; 获取版本号,它变成了 1.1.2。这应该反映在$project.version 中,我正试图从属性文件中重载它。

<plugin>
<groupId>org.codehaus.mojo</groupId>
      <artifactId>properties-maven-plugin</artifactId>
      <version>1.0-alpha-2</version>
      <executions>
            <execution>
                  <phase>process-resources</phase>
                  <goals>
                        <goal>read-project-properties</goal>
                  </goals>
                  <configuration>
                        <files>
                              <file>$project.basedir/extras/version.properties</file>
                        </files>
                  </configuration>
            </execution>
      </executions>
</plugin>

我做错了什么,我根本没有做什么?我对 Maven 的理解非常初级(我来自 Ant 背景)。

【问题讨论】:

它与一个由 Maven 打包的 Android 构建有关,但它也可能被不恰当地标记为 Android 【参考方案1】:

因为你已经有了 pom.xml,你不需要额外的属性文件来定义这样一个简单的属性,使用 POM 的属性标签并覆盖默认的构建 finalName:

<properties>
  <final.build.version>1.1.1</final.build.version>
</properties>
<build>
  ... ...
  <finalName>$project.artifactId-$final.build.version</finalName>
  ... ...
</build>

如果您在发布阶段使用 maven 符号和 zipalign 您的最终 apk,并希望在此处覆盖最终名称,请使用:

<build>
  <plugins>
    <plugin>
      <groupId>com.jayway.maven.plugins.android.generation2</groupId>
      <artifactId>android-maven-plugin</artifactId>
      <extensions>true</extensions>
      <inherited>true</inherited>
      <configuration>
        <undeployBeforeDeploy>true</undeployBeforeDeploy>
        <sign>
          <debug>false</debug>
        </sign>
        <zipalign>
          <verbose>true</verbose>
          <inputApk>$project.build.directory/$project.artifactId-$final.build.version.apk</inputApk>
          <outputApk>$project.build.directory/$project.artifactId-$final.build.version-signed-aligned.apk</outputApk>
        </zipalign>
        </configuration>
          <executions>
            <execution>
              <id>alignApk</id>
              <phase>package</phase>
              <goals>
                <goal>zipalign</goal>
              </goals>
            </execution>
          </executions>
      </plugin>
   </plugins>
</build>

编辑: 如果您必须使用属性文件,请使用 properties-maven-plugin,查看类似的 SO 问题here。

希望对您有所帮助。

【讨论】:

我确实需要该文件用于其他目的。其中的属性被其他脚本重用。它由开发人员手动提交。最终版本号使用它并添加了一些其他限定符,例如时间戳 这确实是我读取值的方式,但似乎虽然可以读取,但无法替代.pom中定义的值 @alex,我认为这不会像 Eclipse 那样在 IDE 中工作,但是,只要你从命令行构建你的应用程序(即 mvn clean install),你应该没问题,仔细检查将其official site 用于用户指南。 我的构建是使用 Git 提交的,其余的由 Jenkins + Maven 负责。可以使用 Jenkins 配置其他步骤和脚本。【参考方案2】:

只是为了回答我自己的问题:事实证明,Maven 需要在脚本中发生任何事情之前设置该属性。因此,它是一成不变的,不能从文件中修改。在触发 Maven 脚本之前,我最终编写了一个 Ant 任务,该任务修改 pom.xml 并更改文件中的版本。丑陋且不平凡,但它有效。

【讨论】:

你应该改用release插件,因为默认的工作周期是在developemt期间有1.1.1-SNAPSHOT,而release会有1.1.1作为版本。这可以通过使用自动执行此操作的发布插件来实现。如果你不喜欢使用发布插件,你可以使用 version-maven-plugin 来更改你的 pom 中的版本。 我正在尝试从文本文件中读取我的构建版本号,但不确定插件如何提供帮助。【参考方案3】:

阅读以下答案:

User and project specific settings in Maven How to read an external properties file in Maven Reading properties file from Maven POM file Read a file into a Maven property

或者只是:

<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <phase>initialize</phase>
            <goals>
              <goal>read-project-properties</goal>
            </goals>
            <configuration>
              <files>
                <file>dev.properties</file> <!-- THIS!!! -->
              </files>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

更新工作概念证明是http://sourceforge.net/u/gavenkoa/exp/ci/default/tree/maven/properties/pom.xml的子项目

mvn compile 运行构建,检查pom.xml 和控制台输出。

【讨论】:

如果您需要参考 pom 文件中的属性,这不起作用...如果您需要,请不要浪费时间阅读其他帖子 @JonnyLeeds 你确定吗?检查我的子项目:sourceforge.net/u/gavenkoa/exp/ci/default/tree/maven/properties/… 进行测试。通过mvn compile 运行它,您会看到来自外部文件的属性值。但我同意properties-maven-plugin 存在问题,并且 Maven 构建系统的可扩展性非常有限。 我指的是您链接到的帖子 - 我不能使用它,因为它需要一个属性文件,而不仅仅是一个纯文本文件。是插件的使用使这项工作。做类似的事情时绝对不会:project.properties.put("versionNumber", new File("version").getText()) @JonnyLeeds 好的,我明白你想要达到的目标。您可以通过&lt;phase&gt;initialize&lt;/phase&gt; 上的 Ant 任务从简单文件内容构建属性文件。我希望&lt;execution&gt; 的顺序像它们一样出现在pom.xml 中,所以在maven-antrun-plugin 之后你可以使用properties-maven-plugin。请参阅ant.apache.org/manual/Tasks/concat.htmlheader 部分以编写PROP = FILE-CONTENT【参考方案4】:

我发现我可以通过使用关于从上面建议的文件中读取的内容在 maven 中解决这个问题,这确实适用于“过滤”(将内容放入属性模板文件),所以我的应用程序知道它是什么版本尽管 maven 很困惑。

我希望它在 pom 文件中的原因是将版本号放入几个缩小的 javascript 文件名中,这样它们就不会在版本更新中被缓存...严格来说,这不需要实际的版本号,所以我使用$maven.build.timestamp 代替它以yyyymmdd-hhmm 格式输出构建的日期+时间。

我想如果我需要更复杂的东西,我会开始将东西剥离到 msbuild 或类似的东西中...... Maven 并没有让事情变得简单,经过一年的斗争,我真的觉得它并没有变得更好。

【讨论】:

以上是关于maven - 从属性文件中读取版本号的主要内容,如果未能解决你的问题,请参考以下文章

从 Maven 中的 POM 文件中读取属性文件

java文件中的Maven版本号

版本号中Snapshot的含义

使用 Maven 从文件名中删除版本号

从 Maven 生成的 Jar 中提取 artifactId 和版本号

使用 maven 将版本号输出到文本文件