我正在构建一个Java应用程序(使用带有build.xml和build.property文件的Ant)。现在我希望能够创建一个不同的“调试”版本,它可以向System.err打印几条诊断消息。这是通过这样的(简化)实现的:
private static final boolean DEBUG = false;
public static void debug (String msg) {
if (DEBUG) {
System.err.println(msg);
}
}
是否有可能在构建时影响DEBUG常量的值?我想我正在寻找的是C-preprocessor定义的Java等价物。理想情况下,我在build.xml文件中有一个不同的构建目标,它将DEBUG设置为true并创建一个myapp-debug.jar作为输出。
相关的用法是应用程序使用的配置文件的名称。这在源代码中也被指定为静态常量,但我希望它在构建时可以调整。
对不起,如果这对你来说显而易见,我不是专家:)
答案 0 :(得分:6)
如果这是您遇到的唯一问题,我建议log4j。
您可能还有其他设置,例如数据库和队列连接等。这些设置都应该外部化为可根据环境而变化的配置。
答案 1 :(得分:2)
通过.properties配置文件控制日志记录选项并不罕见。
您可以阅读加载属性文件,如果加载成功(以便文件不必存在,则使用控制日志记录的属性)。
答案 2 :(得分:1)
Java的构建遵循“构建一次,随处运行”的原则,因此javac
没有预处理器,并且您不能在编译时以任何其他方式更改变量而不是具有单个定义变量的某个地方,并在编译之前在源文件中更改它。
如果您只是为了记录目的而进行此操作,则应该查看java.util.logging包。如果您希望在运行时执行可以为生产环境禁用的特定控件,请查看有关Java assertions的信息。
答案 3 :(得分:1)
我认为将变量外部化为Java Properties文本文件会更容易。然后,您可以从* .property文件或XML文件加载已定义的属性,并使应用程序逻辑依赖于此属性。
在application.properties文件中的类似内容:
application.log.level=DEBUG
然后使用Properties Class的load()方法加载:
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;
}