2

这是build.xml在 Netbeans 上的非 Maven 项目中的脚本,每次我“构建”时,它都会增加 1。

<target name="-pre-compile" description="Sets the buildversion for the current build">
<propertyfile file="${src.dir}\recursos\language.properties">
    <entry key="application.buildnumber" value="1" type="int" operation="+"/>
    <entry key="application.builddate" value="now" type="date"/>
</propertyfile>
</target>

这是我使用的资源文件,我也希望 Maven 编写它:langunge.properties

application.title=Software title...
#build version control
application.buildnumber=334
application.builddate=2016/09/07 15\:16
application.version=1
application.icon=/icons/icon.png

我已经读过关于 mojohaus 的文章,但似乎不符合我的需要。

我知道我必须添加一个带有一些执行/目标标签的插件,但我不知道如何告诉 Maven 将该属性的值增加 1。

4

1 回答 1

2

这是我成功实现它的方法:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <id>read-props</id>
                    <goals>
                        <goal>read-project-properties</goal>
                    </goals>
                    <configuration>
                        <files>
                            <file>src/main/resources/build.properties</file>
                        </files>
                    </configuration>
                </execution>
                <execution>
                    <phase>generate-resources</phase>
                    <id>write-props</id>
                    <goals>
                        <goal>write-project-properties</goal>
                    </goals>
                    <configuration>
                        <outputFile>src/main/resources/build.properties</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.codehaus.gmaven</groupId>
            <artifactId>gmaven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <id>add-dynamic-properties</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>execute</goal>
                    </goals>
                    <configuration>
                        <source>
                                project.properties.buildnumber = (project.properties.buildnumber.toInteger() + 1).toString();
                        </source>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- debug print out, to be removed afterwards -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <echo message="${buildnumber}" />
                        </target>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我们实际上在做什么:

  • 我们正在使用从properties-maven-plugin文件中读取文件(通过其read-projet-properties目标),src/main/resources/build.propertiesinitialize阶段,因此在默认构建周期的早期
  • 现在,该buildnumber属性已从文件中提取,并且是我们构建的一部分。在同一阶段,我们使用gmave-plugin来通过一个小脚本增加它的值。
  • 然后在该generate-resources阶段(例如)我们将 (override)的新值写入buildnumber同一个文件,以供下一次未来迭代。这一步很基础,因为我们需要将状态存储在某个地方,并且它应该处于版本控制之下,即项目的一部分。这src/main/resources可能不是最佳选择,因为它将与应用程序一起打包(您可以随时跳过它),因此您可以将其存储在其他文件中(但它仍然应该是版本化项目的一部分)。
  • 然后,作为调试/证明,antrun将打印当前buildnumber值。

要使其工作,文件中buildnumber属性的初始值build.properties应设置为 0(该属性必须预先存在)。然而,这个文件也有可能在版本控制下持续发生冲突,这就是为什么整个行为应该被包装到一个 Maven 配置文件中并且只在某些情况下使用(例如,在发布期间的团队负责人)。这种约束实际上会导致一种更标准的方法:让 CI 服务器处理整个机制,而不是 maven。

旁注:不幸的是,properties-maven-plugin它没有提供太多配置,它总是会读取和写入所有构建属性,这在大多数情况下是无害的,尽管不是最佳的。最好有一个包含/排除机制来过滤并只读取/写入buildnumber属性。

于 2016-09-23T08:07:16.940 回答