Java库的版本信息,可在运行时访问

时间:2014-01-01 15:17:30

标签: java maven jar

为了支持目的,我需要在Java库中添加版本和构建标识符。库本身是一个没有用户交互的工具包,用于不同的环境(独立的Java应用程序,Web应用程序,Eclipse应用程序,Maven依赖项......)。

我想要的是一个带有一些常数的类给我上述信息(例如MyAppVersion.BUILD,...),以便它们可以显示为例如在对话框,命令行输出等中。经过我的研究,似乎有以下方法:

  • 将版本控制添加到文件名,例如myLibrary-0.1.2.jar;在我们的情况下不可行,因为我在部署时无法控制文件名
  • MANIFEST.MF添加信息并以编程方式阅读,如here所述。但是,我不确定这种方法对于不同的类加载器(Eclipse,OSGi,应用程序服务器......)有多强大,如果JAR文件被重新打包,这些信息就会丢失
  • 使用包含该版本的version.properties文件,如here所述,并在构建期间使用脚本更新version.properties文件
  • 直接将版本信息硬编码到类中并使用脚本更新此信息

还有其他方法吗?对我来说,最后一个选项似乎最“强大”,是否有任何针对此变体的异议?是否有Maven插件支持在构建期间在MyAppVersion.java文件中更新此信息?

2 个答案:

答案 0 :(得分:3)

我建议使用专为此目的而创建的templating-maven-plugin

您最多创建一个单独的模块,其中包含这样的模板类(或模块内):

public final class Version {

    private static final String VERSION = "${project.version}";
    private static final String GROUPID = "${project.groupId}";
    private static final String SVN = "${project.scm.developerConnection}";
    private static final String SVN_BRANCH = "${scmBranch}";
    private static final String REVISION = "${buildNumber}";

    public static String getVersion() {
        return VERSION;
    }

    public static String getGroupId() {
        return GROUPID;
    }

    public static String getSVN() {
        return SVN;
    }

    public static String getRevision() {
        return REVISION;
    }

    public static String getSVNBranch() {
        return SVN_BRANCH;
    }
}

您只需将src/main/java-templates文件夹加上适当的包名称即可。此外,您可以在pom文件中配置templating-maven-plugin,如下所示:

   <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>templating-maven-plugin</artifactId>
        <version>1.0-alpha-3</version>
        <executions>
          <execution>
            <goals>
              <goal>filter-sources</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

这将生成一个类Version,可供其他人使用并包含给定的版本。在上面的模板类中,您可以使用构建中可用的任何属性(如JENKINS_ID等)或您自己定义的内容。

结果是这个类被编译并打包到你的jar文件中。

除此之外,你可以将它与buildnumber-maven-plugin结合起来创建buildNumber,它需要像这样添加到你的pom文件中:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.2</version>
    <configuration>
      <revisionOnScmFailure>UNKNOWN</revisionOnScmFailure>
      <getRevisionOnlyOnce>true</getRevisionOnlyOnce>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>create</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

答案 1 :(得分:0)

硬编码版本的最后一个选项是最强大的,对您来说似乎很重要。 如果你使用ant构建,你可以编写一个类(我们称之为VersionGenerator),它将生成一个带有version的java文件:

package my.cool.package;
public interface Version {
    String VERSION = "1.2.3";
}

从ant调用VersionGenerator 然后编译所有代码并将其滚动到jar中。而你的jar将包含一个新生成和编译的Version.class! VersionGenerator将具有如何命名和增加版本的逻辑