在 Maven 中生成版本.java文件

2022-08-31 17:06:38

我有一个使用 Ant 脚本构建的 Java 项目。我正在尝试将项目转换为Maven。

其中一个任务生成一个名为 Version.java 的 Java 源文件,其中包含编译时间戳的静态 String 表示形式,如下所示:

package com.foo.bar;
public final class Version {
 public static String VERSION="100301.1046";
}

Ant任务非常简单:

<target name="version" depends="init" description="Create Version.java">
    <echo file="src/${package.dir}/Version.java" message="package ${package.name};${line.separator}" />
    <echo file="src/${package.dir}/Version.java" append="true" message="public final class Version {${line.separator}" />
    <echo file="src/${package.dir}/Version.java"
          append="true"
          message=" public static String VERSION=&quot;${buildtime}&quot;;${line.separator}" />
    <echo file="src/${package.dir}/Version.java" append="true" message="}${line.separator}" />
    <echo message="BUILD ${buildtime}" />
</target>

是否可以在Maven中使用生成源或其他一些简单的方法执行类似操作?


答案 1

我不认为这是解决这类问题的好方法。

更好的方法是将版本信息放在一个文件中,该文件将由 Java 程序读取:properties

您的属性文件将包含以下行:

myapp.version=${project.version}

然后,在您的 中指示该文件将由 Maven 过滤pom.xml

<resources>
    <resource>
        <directory>the/directory/that/contains/your/properties/file</directory>
        <filtering>true</filtering>
    </resource>
</resources>

当 Maven 构建您的应用程序时,它将以其价值替换所有应用程序。默认情况下, 定义 的版本(即标记的值)。${...}${project.version}pom.xml<version>

然后,在 Java 代码中,您只需要加载文件并检索属性值。propertiesmyApp.version

请注意,您可以使用内部版本号插件来设置比当前版本更“复杂”的内容(例如,如果您想将构建时间放在您的属性中)。


答案 2

如果你觉得蚂蚁有点丑,你也可以使用maven-replacer-plugin:pom条目可能是:

<project>
  ...
  <properties>
    <version.template.file>src/main/java/com/stackoverflowVersion.java.template</version.template.file>
<version.file>src/main/java/com/stackoverflow/Version.java</version.file>
  </properties>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>maven-replacer-plugin</artifactId>
            <version>1.4.0</version>
            <executions>                
                <execution>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <file>${version.template.file}</file>
                <outputFile>${version.file}</outputFile>
                <replacements>
                    <replacement>
                        <token>@buildnumber@</token>
                        <value>${svn.revision}</value>
                    </replacement>
                    <replacement>
                        <token>@buildtime@</token>
                        <value>${maven.build.timestamp}</value>
                    </replacement>
                    <replacement>
                        <token>@pomversion@</token>
                        <value>${project.version}</value>
                    </replacement>
                </replacements>                        
            </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

版本.java模板可能是:

package com.stackoverflow;

public final class Version {

    public static final String build_number="@buildnumber@";

    public static final String build_time="@buildtime@";

    public static final String pomversion="@pomversion@";

}

推荐