创建Java应用程序的不同构建版本

问题描述:

我构建了一个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

通过.properties配置文件控制日志记录选项并不罕见。

您可以读取加载属性文件,并且如果加载成功(以便该文件不必强制存在),请使用控制日志记录的属性。

+0

哦对不起,我刚刚回答这个问题时发布了类似的答案....对于冗余抱歉。 – fasseg 2010-02-10 21:46:04

+0

我认为你是对的:财产档案是要走的路。我错误地认为这只会将问题推到一层以外,因为那样我会对属性文件的名称/位置进行硬编码,但是我记得我可以在类路径中查找它(包括应用程序JAR,如果有的话)。谢谢! – Zilk 2010-02-11 00:49:33

Java的构建以“打造一次,到处运行”,所以javac没有一个预处理器,和你的原则不能在编译时以任何其他方式更改变量,而不是在某处定义一个变量的单个定义,并在编译之前在源文件中更改它。

如果您只是为了记录目的而这样做,那么您应该查看java.util.logging软件包。如果您想要在生产环境中禁用运行时执行的特定控件,请查看有关Java assertions的信息。

我认为将变量外部化为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; 
} 

我建议log4j如果这是你唯一的问题。

您可能会有其他设置,例如数据库和队列连接等。这些都应该外部化为可根据环境而变化的配置。

+0

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