2013-01-17 9 views
0

我們希望將Java源代碼的版本嵌入到生成的類文件中,在我們的示例中爲svn $ Id $字符串。如何在java類中嵌入版本字符串

我們希望能夠從類文件的靜態檢查中確定此信息,最好是通過運行字符串或執行什麼命令。

一個天真的嘗試,聲明一個私有的最終靜態字符串變量設置爲這個值在每個類內沒有導致一個易讀的字符串嵌入類文件。

+0

你的版本字符串是怎麼樣的?三字節'1.0'在二進制文件中很容易忽略。 –

+0

另請參見[什麼是serialVersionUID,爲什麼要使用它?](http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it)。這可能很有趣。 –

+0

@Jan謝謝。我用一個未擴展的「$ Id $」字符串進行測試,一旦我將其檢入到svn並以擴展形式返回,我在字符串命令的輸出中注意到它 –

回答

1

您可以使用預定義的名稱向每個類的底部添加一個方法。假設你使用:

public String extractChaimGeretzVersionNumber() { 
    return "$Id$"; 
} 

然後你找到加載類的程序版本,並通過反射,調用魔術方法和檢索版本。

在構建.class和.jar文件之前,您必須擁有將該方法插入.java文件的代碼,或者您可以通過構建步驟檢查魔法方法是否已經存在於每個文件中。如果找不到,則會失敗。

+1

當我一次做了這類事情時,我只會在與版本控制綁定的jar文件中添加一些內容。因此,您需要標記VC,提取所有源代碼,將標記構建到清單中(或者讓構建腳本編寫一個從靜態方法返回標記的類),然後構建jar。如果您需要知道類文件的版本是否存在,請從jar中獲取標籤(或者將其顯示在屏幕上或記錄下來),然後從版本控制中檢索代碼版本。 –

1

你說... 最好通過運行什麼命令字符串或...

讓我們假設你在你的代碼是這樣的:

private static final String SVN_ID = 
    "$Id: SvnIdDemo.java 1081 2008-09-30 19:03:23Z john $"; 

下面的Perl一行代碼...

$ perl -nwe 'print "$1\n" if /.*(\$Id:[^\$]+\$).*/' SvnIdDemo.class 

...將SVN ID字符串打印到STDOUT。

$Id: SvnIdDemo.java 1081 2008-09-30 19:03:23Z john $ 
+1

給定的Perl語法適用於Unix系統。在Windows上,您不能在小腳本中使用單引號。您需要使用雙引號,這需要您使用反斜槓來轉義內部雙引號。 – oheyder

相關問題