commons-logging 为开发独立于日志实现系统的程序提供了一个统一的接口,我们可以在应用程序中通过设置一个环境变量来指定我们要使用的日志系统(如 log4j):
System.setProperty("org.apache.commons.logging.LogFactory",
"org.apache.commons.logging.impl.Log4jFactory");
System.setProperty("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.Log4JLogger");
但是在开发 WAS 应用或者其他 web/j2ee 应用的时候应该特别小心,因为这个环境变量是全局性的,如果你设置了该变量,很可能会影响到其他应用,甚至应用服务器。
最近我们开发的一个 WAS 应用项目就遇到了这个问题。 我们的应用是一个 WAS ISC(Integrated Solution Console) 应用。我们在自己的程序里面设置了如上环境变量,然后把 commons-logging 和 log4j 的 jar 包放到我们应用自己的 classpath 中。不幸的是,WAS ISC 也是通过 commons-logging 的这两个环境变量来确定当前的日志系统并使用。本来WAS 是将这两个环境变量设置为一个非 log4j 的日志系统,而我们的应用把它改成了 log4j,所以导致 ISC 加载 class 的时候出错,因为 ISC 的 classpath 中根本没有 log4j.jar.
使用 commons-logging 的环境变量是一个糟糕的选择,应该尽量避免。