我有一个构建文件,作为构建过程的一部分依赖于几个taskdef。这些taskdef项(例如,webdoclet和jasper2)使用log4j作为记录器。理想情况下,我希望能够为每个提供不同的log4j配置文件,但最低限度,我希望能够指定使用哪个log4j配置文件。
我以前做过的工作就是在类路径的前面放置包含我希望taskdef使用的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”目录位于类路径的前面,并且该目录中存在log4j.xml。但是,当我在调试时使用log4j以详细模式运行ant时,我看到log4j正在选择当前工作目录中的log4j.xml,这不是我想要的那个。 Log4j似乎没有使用类路径来解析默认的log4j.xml。
我正在使用log4j 1.2.8(嵌入在更大的框架中,所以我无法升级它),其中一些taskdef似乎依赖于commons-logging 1.0.3。构建过程使用Sun Java 5.
如果在运行ant之前我set ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml
,taskdef会正确加载所需的log4j.xml。
将“Build”目录放在类路径的前面,用于工作的taskdef。我不知道改变了什么。如何恢复我可以控制的行为 - 在build.xml中 - 哪个log4j配置文件用于给定任务?除了设置ANT_OPTS以外,还有其他方法可以将应用程序的log4j.xml移出当前工作目录以使log4j找到正确的log4j.xml文件而不是重新排列文件吗?
答案 0 :(得分:3)
我能够使用sysproperty
的相对文件URL指定配置文件,如下所示:
<java classname="com.lunatech.MainClass">
<sysproperty key="log4j.configuration" value="file:src/log4j-debug.properties"/>
<classpath refid="runtime.classpath"/>
</java>
答案 1 :(得分:2)
Log4j通过查找系统属性log4j.configuration来加载其配置。如果做不到这一点,它会在类路径上查找log4j.properties或log4j.xml。
在一些分支新JVM的ant任务中,您可以使用&lt; jvmarg /&gt;指定log4j.configuration系统属性。标签。但是,对于那些不是最好的选择是创建一个类路径条目,其第一个条目是您想要使用的log4j配置。
答案 2 :(得分:0)
您可以移动当前工作目录中的log4j.xml文件吗?
答案 3 :(得分:0)
如果我在运行ant之前设置了ANT_OPTS = -Dlog4j.configuration = Build / log4j.xml,那么taskdefs会正确加载所需的log4j.xml。
您是否尝试过使用sysproperty设置此属性?
应该是这样的:
<target name="define.jasper2">
<sysproperty key="log4j.configuration" value="Build/log4j.xml"/>
...
</target>