Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java库的版本信息,可在运行时访问_Java_Maven_Jar - Fatal编程技术网

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

Java库的版本信息,可在运行时访问,java,maven,jar,Java,Maven,Jar,出于支持目的,我需要向Java库添加一个版本和构建标识符。该库本身是一个没有用户交互的工具包,用于不同的环境(独立Java应用程序、web应用程序、Eclipse应用程序、Maven依赖性等) 我想要的是一个带有一些常量的类,它为我提供了上述信息(例如MyAppVersion.BUILD,…),以便它们可以显示在对话框、命令行输出等中。在我研究之后,似乎有以下方法: 向文件名添加版本控制,例如myLibrary-0.1.2.jar;在本例中不可行,因为部署时我无法控制文件名 将信息添加到MAN

出于支持目的,我需要向Java库添加一个版本和构建标识符。该库本身是一个没有用户交互的工具包,用于不同的环境(独立Java应用程序、web应用程序、Eclipse应用程序、Maven依赖性等)

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

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

还有其他方法吗?最后一个选项对我来说似乎最“稳健”,对这个变体有什么反对意见吗?是否有Maven插件支持在构建过程中更新
MyAppVersion.java
文件中的此信息?

硬编码版本的最后一个选项是最健壮的,这似乎对您很重要。 如果您使用ant构建,您可以编写一个类(我们称之为VersionGenerator),该类将生成一个版本为的java文件:

package my.cool.package;
public interface Version {
    String VERSION = "1.2.3";
}
从ant调用VersionGenerator 然后编译所有代码并将其放入jar中。您的jar将包含一个新生成和编译的Version.class!
VersionGenerator将具有如何命名和增加版本的逻辑

我建议使用的正是为此目的而创建的

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

公共最终类版本{
私有静态最终字符串版本=“${project.VERSION}”;
私有静态最终字符串GROUPID=“${project.GROUPID}”;
私有静态最终字符串SVN=“${project.scm.developerConnection}”;
私有静态最终字符串SVN_BRANCH=“${scmBranch}”;
私有静态最终字符串修订版=“${buildNumber}”;
公共静态字符串getVersion(){
返回版本;
}
公共静态字符串getGroupId(){
返回GROUPID;
}
公共静态字符串getSVN(){
返回SVN;
}
公共静态字符串getRevision(){
返回修订;
}
公共静态字符串getSVNBranch(){
返回SVN_分支机构;
}
}
您只需将其放入文件夹,再加上适当的包名。此外,您可以在pom文件中配置模板maven插件,如下所示:


org.codehaus.mojo
要创建需要添加到pom文件中的buildNumber,如下所示:

  <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>

org.codehaus.mojo
buildnumber maven插件
1.2
不为人知
真的
创造

提供了从清单中获取版本的更简洁的方法。简而言之:
String version=this.getClass().getPackage().getImplementationVersion()
听起来像是使用属性文件并用maven过滤,让它插入版本号。最好使用基于maven的工具,如suggest Templateing-maven-plugin。谢谢,但我使用的是maven,khmarbaise的解决方案在我看来非常完美!太好了,看起来正是我想要的!非常感谢。