2009-12-16 81 views
4

是否存在與C++編譯時常量__DATE__和__TIME__相當的Java。我需要打印正在編譯的程序的編譯時間和版本信息。編譯日期和時間

感謝

kodev19

+0

您是否熟悉Ant? – BalusC 2009-12-16 21:01:20

+0

編譯時約束意味着時間戳必須嵌入Java源文件中,而不是存儲在外部文本文件中。 – 2009-12-16 21:05:00

+0

@Dave - 我不確定那是真的,是嗎?你不能在編譯開始之前的其他地方記錄編譯時間(我意識到它不是*完全*精確,但是......) – 2009-12-16 21:23:09

回答

2

不能直接在代碼中,沒有,但你可以使用Ant來做到這一點。

請參閱this page上的「袋熊」示例。

3

Ant TStamp任務在這裏有用。它會在編譯時創建一個時間戳,以便插入到屬性文件或代碼中。

在當前項目中設置DSTAMP,TSTAMP和TODAY 屬性。默認情況下,DSTAMP屬性爲 格式「yyyyMMdd」,TSTAMP格式爲「hhmm」,格式爲「MMMM dd yyyy」,格式爲 ,TSTAY格式爲 。使用嵌套的 元素來指定 不同的格式。

這些屬性可以在 構建文件中使用,例如,創造 時間戳的文件名,或者用來代替 裏面 文件佔位符標記來表示,例如, 的發佈日期。 此任務的最佳位置可能在 初始化目標中。

我傾向於使用這個建立包含建立時間和日期,用戶和主機,版本號等,然後我的應用程序讀取屬性文件並記錄相關的信息(我不是一個屬性文件通常在我擔心人們擺弄這些信息的環境中)。

6

據我所知,沒有這樣的事情。 但是在正在運行的JVM上,您可以使用類似以下代碼的方式從jar中直接獲取一些信息(這裏,信息來自編譯時放置在jar中的Manifest文件(您的構建系統是Ant,或者Maven的或其他任何東西)。隨意adapte它(不同的輸出,等等)。

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; 
} 

將輸出一次使用類似(這裏的公共琅2.4.jar可用StringUtils.class 2008年3月15日20:43)編譯:

StringUtils的$公地琅2.4 $ 15/03/2008 20時43分16秒

+0

好的答案。有點醜,但它適用於我。 – heaphach 2015-06-11 14:01:49