【发布时间】:2010-09-11 04:54:30
【问题描述】:
当我使用 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();
}
在我看来,这是一个 hack,可能会被具有类似名称的文件的人绕过/破坏。在 JAR 之外,但在类路径上。
无论如何,我的问题是是否有办法在编译时将常量注入到类中
编辑
我认为在 JAR 中使用外部生成的文件是因为这个 是)一个库并将嵌入到客户端应用程序中。这些客户端应用程序可能会定义自己的类加载器,这意味着我不能依赖标准的 JVM 类加载规则。
我个人的偏好是按照 serg10 的建议使用 JAR 文件中的日期。
【问题讨论】:
-
在我看来,这是一个 hack,可能会被在 JAR 之外但在类路径上具有类似名称文件的人规避/破坏。 你在什么工作环境中编程你担心人们“规避”这个吗?让 Ant 生成文件根本不是 hack。当然,清单方法甚至更好的 Java 主义(你也可以让 Ant 自动化)。