2010-02-10 91 views
1

我構建了一個Java應用程序(將Ant與build.xml和build.property文件一起使用)。現在我想能夠創建一個不同的「調試」版本,它可以向System.err輸出幾條診斷消息。這是通過這樣的事情來實現(簡體):創建Java應用程序的不同構建版本

private static final boolean DEBUG = false; 

public static void debug (String msg) { 
    if (DEBUG) { 
     System.err.println(msg); 
    } 
} 

是否有可能在構建時影響DEBUG常量的值?我想我要找的是C預處理器定義的Java等價物。理想情況下,我會在build.xml文件中有一個不同的構建目標,它將DEBUG設置爲true,並創建一個myapp-debug.jar作爲輸出。

這個的相關用法將是應用程序使用的配置文件的名稱。這也是在源代碼中指定爲靜態常量,但我更願意在構建時調整它。

很抱歉,如果這一切都是有目共睹的你,我不是專家:)

+0

您對多個版本的要求是什麼?爲什麼不只有一個構建可以在運行時打開或關閉DEBUG? – 2010-02-11 20:55:43

回答

2

通過.properties配置文件控制日誌記錄選項並不罕見。

您可以讀取加載屬性文件,並且如果加載成功(以便該文件不必強制存在),請使用控制日誌記錄的屬性。

+0

哦對不起,我剛剛回答這個問題時發佈了類似的答案....對於冗餘抱歉。 – fasseg 2010-02-10 21:46:04

+0

我認爲你是對的:財產檔案是要走的路。我錯誤地認爲這隻會將問題推到一層以外,因爲那樣我會對屬性文件的名稱/位置進行硬編碼,但是我記得我可以在類路徑中查找它(包括應用程序JAR,如果有的話)。謝謝! – Zilk 2010-02-11 00:49:33

1

Java的構建以「打造一次,到處運行」,所以javac沒有一個預處理器,和你的原則不能在編譯時以任何其他方式更改變量,而不是在某處定義一個變量的單個定義,並在編譯之前在源文件中更改它。

如果您只是爲了記錄目的而這樣做,那麼您應該查看java.util.logging軟件包。如果您想要在生產環境中禁用運行時執行的特定控件,請查看有關Java assertions的信息。

1

我認爲將變量外部化爲Java屬性文本文件會更容易。您可以從* .property文件或XML文件加載定義的屬性,並使應用程序邏輯依賴於此屬性。

像這樣在一個application.properties文件:

application.log.level=DEBUG 

,然後通過使用屬性類的負載()方法加載:

Properties props = new Properties(); 
props.load(new FileInputStream("application.properties")); 
String debugLevel=props.getProperty("application.log.level"); 
boolean debug; 
if (debugLevel!=null && debugLevel.equals("DEBUG")) { 
    debug=true; 
} 
6

我建議log4j如果這是你唯一的問題。

您可能會有其他設置,例如數據庫和隊列連接等。這些都應該外部化爲可根據環境而變化的配置。

+0

..或它的內部後繼logback:http://logback.qos.ch(+1)。 – BalusC 2010-02-10 21:47:44

相關問題