结合日期和时间

时间:2009-12-16 20:58:45

标签: java compile-time

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

由于

kodev19

3 个答案:

答案 0 :(得分:6)

据我所知,没有类似的东西。 但是在运行的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

答案 1 :(得分:3)

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

  

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

     

这些属性可用于   例如,build-file来创建   带时间戳的文件名,或用于   替换里面的占位符标签   例如,表明的文件   发布日期。最好的地方   这个任务可能在一个   初始化目标。

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

答案 2 :(得分:2)

不直接在代码中,不,但您可以使用Ant来执行此操作。

请参阅this page上的“wombat”示例。