我有一个构建文件,在构建过程中依赖于几个任务定义。这些任务定义项目(例如,webdoclet和jasper2)使用log4j作为记录器。理想情况下,我想为每个提供不同的log4j配置文件,但最少,我想能够指定使用哪个log4j配置文件。
我之前所做的有效方法是,在类路径的前面放置包含我想要任务定义使用的log4j.xml的目录。例如:
<target name="define.jasper2"> <path id="jspc.classpath"> <!-- Put this FIRST so Jasper will find the log4j.xml in the Build directory --> <pathelement location="Build"/> <fileset dir="${tomcat.libs}"> .... </fileset> <pathelement location="${log4j.jar}"/> .... </path> <taskdef name="jasper2" classname="org.apache.jasper.JspC" classpathref="jspc.classpath"/> </target>
我已经验证了,“Build”目录实际上位于classpath的前面,并且该目录中存在一个log4j.xml。然而,当我以调试模式在ant中运行带有log4j的详细模式时,我看到log4j正在选择当前工作目录中的log4j.xml,这不是我想要的。Log4j似乎没有使用classpath来解析默认的log4j.xml。
我正在使用 log4j 1.2.8(嵌入到更大的框架中,所以我不能升级它),一些任务可能依赖于 commons-logging 1.0.3。构建过程使用 Sun Java 5。
如果在运行ant之前设置了set ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml
,那么任务定义将正确加载所需的log4j.xml。
把“Build”目录放在任务定义的类路径前面曾经有效。我不知道发生了什么变化。如何恢复我可以在build.xml中控制哪个log4j配置文件用于特定任务的行为?除了设置ANT_OPTS和重新排列文件以将应用程序的log4j.xml移出当前工作目录以使log4j找到正确的log4j.xml文件之外,是否还有其他方法?