如何在java类中嵌入版本字符串

Posted

技术标签:

【中文标题】如何在java类中嵌入版本字符串【英文标题】:How to embed version strings in java classes 【发布时间】:2013-01-01 11:43:06 【问题描述】:

我们希望有 java 源代码的版本,在我们的例子中是 svn $Id$ 字符串,嵌入到生成的类文件中。

我们希望能够通过对类文件的静态检查来确定此信息,最好是通过运行字符串或什么命令。

在每个类中声明一个私有的最终静态字符串变量并设置为该值的天真尝试不会导致在类文件中嵌入一个清晰的字符串。

【问题讨论】:

您的版本字符串是什么样的?三个字节1.0 在二进制文件中很容易被忽略。 另见What is a serialVersionUID and why should I use it?。这可能会很有趣。 @Jan 谢谢。我正在使用未扩展的“$Id$”字符串进行测试,一旦我将其签入 svn 并以扩展形式将其取回,我在 strings 命令的输出中注意到它 需要class文件里的版本吗?还是您希望您的 java 应用程序返回版本号?通常这会放在 jar/war/ear 清单文件中。 我们没有使用 _ar 打包机制,所以它需要在每个类文件中 【参考方案1】:

你说... 最好通过运行字符串或什么命令 ...

假设您的代码中有这样的内容:

private static final String SVN_ID = 
    "$Id: SvnIdDemo.java 1081 2008-09-30 19:03:23Z john $";

下面的 Perl 单行...

$ perl -nwe 'print "$1\n" if /.*(\$Id:[^\$]+\$).*/' SvnIdDemo.class

... 将 SVN ID 字符串打印到 STDOUT。

$Id: SvnIdDemo.java 1081 2008-09-30 19:03:23Z john $

【讨论】:

给定的 Perl 语法适用于类 Unix 系统。在 Windows 上,您不能对迷你脚本使用单引号。您需要双引号,这需要您使用反斜杠转义内部双引号。【参考方案2】:

您可以在每个类的底部添加一个具有预定义名称的方法。假设您使用过:

public String extractChaimGeretzVersionNumber() 
    return "$Id$";

然后,您会找到带有加载类的程序的版本,并通过反射调用魔术方法并检索版本。

您要么必须在构建 .class 和 .jar 文件之前拥有将方法插入 .java 文件的代码,要么您可以有一个构建步骤来检查魔术方法是否已经存在于每个文件中。如果找不到,则构建失败。

【讨论】:

当我有一次做这种事情时,我会在与版本控制相关的 jar 文件中放一些东西。因此,您标记 VC,提取所有源代码,将标记构建到清单中(或让构建脚本编写一个从静态方法返回标签的类),然后构建 jar。如果您需要知道类文件的版本,请从 jar 中获取标签(或将其显示在屏幕上或记录下来),然后从版本控制中检索代码版本。

以上是关于如何在java类中嵌入版本字符串的主要内容,如果未能解决你的问题,请参考以下文章

java中在一个类中如何设定默认值

如何在一个类中调用java.util包中StringBuffer类的toString方法

如何从命令行调用嵌入式 jre 以运行 java 应用程序

您如何管理 java webapps 中的嵌入式配置文件和库?

单例对象是否符合垃圾回收条件?类中的静态字段如何收集垃圾?

如何理解嵌入在 Java Script 中的 SQL 查询中的转义