编译日期和时间

是否存在与C&C ++编译时常量__DATE__和__TIME__等效的Java。 我需要打印正在编译的程序的编译时间和版本信息。

谢谢

kodev19

据我所知,没有类似的东西。 但是在运行的JVM上你可以使用类似下面代码的东西直接从jar获取一些信息(这里,信息来自编译时放在jar中的Manifest文件(无论你的构建系统是什么,Ant或Maven)或其他任何东西)。随意调整它(不同的输出,等等)。

public String getVersionfinal Class classe) { String version = null; String shortClassName = classe.getName().substring(classe.getName().lastIndexOf(".") + 1); try { ClassLoader cl = this.getClass().getClassLoader(); String threadContexteClass = classe.getName().replace('.', '/'); URL url = cl.getResource(threadContexteClass + ".class"); if ( url == null ) { version = shortClassName + " $ (no manifest)"; } else { String path = url.getPath(); String jarExt = ".jar"; int index = path.indexOf(jarExt); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); if (index != -1) { String jarPath = path.substring(0, index + jarExt.length()); File file = new File(jarPath); String jarVersion = file.getName(); JarFile jarFile = new JarFile(new File(new URI(jarPath))); JarEntry entry = jarFile.getJarEntry("META-INF/MANIFEST.MF"); version = shortClassName + " $ " + jarVersion.substring(0, jarVersion.length() - jarExt.length()) + " $ " + sdf.format(new Date(entry.getTime())); CloseHelper.close(jarFile); } else { File file = new File(path); version = shortClassName + " $ " + sdf.format(new Date(file.lastModified())); } } } catch (Exception e) { version = shortClassName + " $ " + e.toString(); } return version; } 

将输出一次使用的东西(这里为2008年3月15日20:43编译的commons-lang-2.4.jar中可用的StringUtils.class):

StringUtils $ commons-lang-2.4 $ 15/03/2008 20:43:16

Ant TStamp任务在这里有用。 它将在构建期间创建一个时间戳,以插入属性文件或代码。

设置当前项目中的DSTAMP,TSTAMP和TODAY属性。 默认情况下,DSTAMP属性的格式为“yyyyMMdd”,TSTAMP的格式为“hhmm”,而TODAY的格式为“MMMM dd yyyy”。 使用嵌套元素指定不同的格式。

例如,可以在构建文件中使用这些属性来创建带时间戳的文件名,或者用于替换文档中的占位符标记以指示(例如)发布日期。 此任务的最佳位置可能是初始化目标。

我倾向于使用它来构建包含构建时间和日期,用户和主机,版本号等的属性文件,然后我的应用程序读取该属性文件并记录相关信息(我通常不在我所处的环境中’担心人们摆弄这个信息)。

不是直接在代码中,不,但你可以使用Ant来做到这一点。

请参阅此页面上的“wombat”示例。