English 中文(简体)
我该如何为不同的 ant 任务提供自定义的 log4j.xml 文件?
原标题:
  • 时间:2009-01-26 23:23:19
  •  标签:

我有一个构建文件,在构建过程中依赖于几个任务定义。这些任务定义项目(例如,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文件之外,是否还有其他方法?

问题回答

我可以使用sysproperty指定一个相对文件URL的配置文件,例如:

<java classname="com.lunatech.MainClass">
   <sysproperty key="log4j.configuration" value="file:src/log4j-debug.properties"/>
   <classpath refid="runtime.classpath"/>
</java>

Log4j通过查找系统属性log4j.configuration来加载其配置。如果失败,则在类路径上查找log4j.properties或log4j.xml。

在某些分叉新 JVM 的蚂蚁任务中,您可以使用 <jvmarg/> 标签指定 log4j.configuration 系统属性。但是,在那些不需要的情况下,最好的选择是创建一个类路径条目,其第一个条目是您想要使用的 log4j 配置。

您可以移动当前工作目录中的log4j.xml文件吗?

如果我在运行ant之前设置ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml,则任务定义将正确加载所需的log4j.xml。

你尝试过使用sysproperty来设置这个属性吗?

应该看起来像这样:

<target name="define.jasper2">
   <sysproperty key="log4j.configuration" value="Build/log4j.xml"/>
   ...
</target>




相关问题
热门标签