当我过去用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的清单文件中。
这是一个有据可查并易于理解的Java规范。
存在用于创建清单文件的强大工具支持(例如,核心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标准方法,因此对于后续的代码维护人员来说,可能会变得更加容易。
问题内容: 有什么办法可以反编译Linux .so? 问题答案: 有反编译器,但是反编译器可能不会以与原始程序所用语言相同的语言发出代码。 也有反汇编程序,可以将机器代码重新汇编为汇编程序。 反编译Wiki 可能是其他信息的良好来源。
问题内容: 考虑以下示例代码 它给出以下输出 方法调用将在运行时解决,并按预期调用正确的重写方法。 后来我了解到,变量访问是在编译时解决的。我期望输出为 因为在派生类中阴影的重新定义是在基类中的。 为什么变量的绑定在编译时而不是在运行时发生?这是仅出于性能原因吗? 问题答案: 原因在Java语言规范的15.11节中的示例中进行了说明,如下所示: … 最后一行表明,实际上,所访问的字段不依赖于所引用
所以我必须做以下其中之一: 在每个doSomething调用周围添加try catch块 在main中添加throws语句 删除doSomething中的throws语句 将该条件作为前提条件,这样不遵循该条件就会导致未定义的行为或类似的行为。 3将不起作用,因为doSomething可能会在客户端使用时引发异常。1和2简直是多余的,我认为应该避免。 我的问题是:在提到的选项(或任何其他选项)中,
问题内容: 我正在尝试用其他常量定义常量,但似乎无法完成,因为当所需常量依赖于它时,初始常量尚未准备就绪。我想确定这是否完全不可能。 目前,我有这样的常量: 后两个常数是我想要完成的 问题答案: 定义控制器,服务和其他控制器之间的依赖关系的角度方法是通过依赖关系注入(DI)。因此,如果您有一个依赖于服务B的控制器A,则必须像这样创建它。 可以看到,angular将检查serviceB依赖关系,并查
我一直在关注快板5平台和他的文件管理器使用的教程!openFile.eof(),我听说它不好,我很确定它是什么让我的矢量下标超出范围错误。除了它,还有什么我可以使用的吗?另外,你能检查一下我的图层类,以防我的矢量下标超出范围错误吗?我想不出来,我很确定它来自文件管理器,但我不知道。 它仅输出地图的第一行。当我把它改成“而”(标准:::getline(打开文件,行))时,我甚至从未去过标准::cou
问题内容: Java语言文档说: 如果将原始类型或字符串定义为常量,并且在编译时知道该值,则编译器会使用其值替换代码中各处的常量名称。这称为编译时常量。 我的理解是,如果我们有一段代码: 然后,编译器会将x代码中每次出现的内容替换为literal 10。 但假设常量在运行时初始化: 与编译时常量相比,性能是否会下降(无论可以忽略不计)? 另一个问题是下面的代码行: 被编译器以与编译时常量相同的方式