有没有办法在编译时为Java定义一个常量值
当我曾经用C / C++编写库时,我养成了一个返回编译日期/时间的方法的习惯。这总是编译到库中,因此可以区分库的构建。我通过在代码中返回#define得到了这个:
C++:
#ifdef _BuildDateTime_
char* SomeClass::getBuildDateTime() {
return _BuildDateTime_;
}
#else
char* SomeClass::getBuildDateTime() {
return "Undefined";
}
#endif
然后在编译时,我在构建脚本中有一个'-D_BuildDateTime_='。Date
有没有办法在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文件中的日期。