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
似乎从<version></version>
获取版本号,它变成了 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 好的,我明白你想要达到的目标。您可以通过<phase>initialize</phase>
上的 Ant 任务从简单文件内容构建属性文件。我希望<execution>
的顺序像它们一样出现在pom.xml
中,所以在maven-antrun-plugin
之后你可以使用properties-maven-plugin
。请参阅ant.apache.org/manual/Tasks/concat.html 和header
部分以编写PROP = FILE-CONTENT
【参考方案4】:
我发现我可以通过使用关于从上面建议的文件中读取的内容在 maven 中解决这个问题,这确实适用于“过滤”(将内容放入属性模板文件),所以我的应用程序知道它是什么版本尽管 maven 很困惑。
我希望它在 pom 文件中的原因是将版本号放入几个缩小的 javascript 文件名中,这样它们就不会在版本更新中被缓存...严格来说,这不需要实际的版本号,所以我使用$maven.build.timestamp
代替它以yyyymmdd-hhmm
格式输出构建的日期+时间。
我想如果我需要更复杂的东西,我会开始将东西剥离到 msbuild 或类似的东西中...... Maven 并没有让事情变得简单,经过一年的斗争,我真的觉得它并没有变得更好。
【讨论】:
以上是关于maven - 从属性文件中读取版本号的主要内容,如果未能解决你的问题,请参考以下文章