有什么办法可以在编译时为Java定义一个常量值

当我过去用C / C

++编写库时,我习惯于拥有一种返回编译日期/时间的方法。这始终是编译到库中的,因此可以区分库的内部版本。我通过在代码中返回#define来获得此信息:

C ++:

#ifdef _BuildDateTime_

char* SomeClass::getBuildDateTime() {

return _BuildDateTime_;

}

#else

char* SomeClass::getBuildDateTime() {

return "Undefined";

}

#endif

然后在编译时,我Date在构建脚本中有一个’-D_BuildDateTime_ = ‘。

有什么方法可以在Java中实现此目的或类似目的,而无需记住手动编辑任何文件或分发任何单独的文件。

我从同事那里得到的一个建议是获取ant文件,以在类路径上创建一个文件,并将其打包到JAR中,并由该方法读取它。

诸如此类(假设创建的文件名为“ DateTime.dat”):

// I know Exceptions and proper open/closing 

// of the file are not done. This is just

// to explain the point!

String getBuildDateTime() {

return new BufferedReader(getClass()

.getResourceAsStream("DateTime.dat")).readLine();

}

在我看来,这是一种黑客行为,可能会被在JAR 之外 但在类路径上具有类似名称的文件的人绕开/破坏。

无论如何,我的问题是在编译时是否有任何方法可以将常量注入类中

编辑

我之所以考虑在JAR中使用外部生成的文件,是因为它

一个库,并将被嵌入客户端应用程序中。这些客户端应用程序可以定义自己的类加载器,这意味着我不能依赖标准的JVM类加载规则。

我个人偏爱使用serg10建议的使用JAR文件中的日期。

回答:

将您的版本信息(以及其他有用的发布者资料,例如内部版本号,Subversion修订号,作者,公司详细信息等)放入jar的清单文件中。

存在用于创建清单文件的强大工具支持(例如,核心Ant任务或maven

jar插件)。这些可以帮助自动设置一些属性-

我已经配置了maven,以便在构建时将jar的maven版本号,Subversion修订版和时间戳记放入清单中。

您可以在运行时使用标准的Java api调用读取清单的内容-类似于:

import java.util.jar.*;

...

JarFile myJar = new JarFile("nameOfJar.jar"); // various constructors available

Manifest manifest = myJar.getManifest();

Map<String,Attributes> manifestContents = manifest.getAttributes();

对我来说,这感觉更像是Java标准方法,因此对于后续的代码维护人员来说,可能会变得更加容易。

以上是 有什么办法可以在编译时为Java定义一个常量值 的全部内容, 来源链接: utcz.com/qa/413105.html

回到顶部