Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为不同的ant任务提供定制的log4j.xml?_Java_Ant_Log4j_Taskdef - Fatal编程技术网

Java 如何为不同的ant任务提供定制的log4j.xml?

Java 如何为不同的ant任务提供定制的log4j.xml?,java,ant,log4j,taskdef,Java,Ant,Log4j,Taskdef,我有一个构建文件,作为构建过程的一部分,它依赖于几个taskdef。这些taskdef项(例如webdoclet和jasper2)使用log4j作为记录器。理想情况下,我希望能够为每个配置文件提供不同的log4j配置文件,但至少我希望能够指定使用哪个log4j配置文件 我过去所做的工作是将包含我希望taskdef使用的log4j.xml的目录放在类路径的前面。例如: <target name="define.jasper2"> <path id="jspc.classpath">

我有一个构建文件,作为构建过程的一部分,它依赖于几个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。但是,当我在详细模式下运行ant并在调试中使用log4j时,我看到log4j正在选择当前工作目录中的log4j.xml,这不是我想要的。Log4j似乎没有使用类路径来解析默认的Log4j.xml

我使用的是log4j 1.2.8(嵌入在一个更大的框架中,因此我无法升级),其中一些TaskDef似乎依赖于commons logging 1.0.3。构建过程使用Sun Java 5

如果在运行ANT之前设置ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml,taskdefs将正确加载所需的log4j.xml


将用于工作的taskdef的“Build”目录放在类路径的前面。我不知道发生了什么变化。如何恢复可以控制的行为(在build.xml中)用于给定任务的log4j配置文件?除了设置ANT_OPTS和重新排列文件之外,是否还有其他方法将应用程序的log4j.xml移出当前工作目录,以使log4j找到正确的log4j.xml文件?

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

log4j通过查找系统属性来加载其配置log4j.配置。否则,它将在类路径上查找log4j.properties或log4j.xml

在一些派生新JVM的ant任务上,可以使用标记指定log4j.configuration系统属性。然而,对于那些没有的,您最好的选择是创建一个classpath条目,它的第一个条目是您想要使用的log4j配置

如果在运行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>
<java classname="com.lunatech.MainClass">
   <sysproperty key="log4j.configuration" value="file:src/log4j-debug.properties"/>
   <classpath refid="runtime.classpath"/>
</java>

...

我可以使用带有
sysproperty
的相对文件URL指定配置文件,如下所示:

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


我真的希望不必移动任何文件。好吧,我正在按照您的建议做——我创建一个classpath条目,其第一个条目是要使用的(包含)log4j配置的目录。这以前有用,但现在不行了。如果我将log4j.xml文件放在类路径上,它仍然不起作用。jasper2任务似乎支持“fork”元素,您能将其设置为true并尝试使用jvmarg吗?启动ant时使用-verbose和-debug参数,也许额外的信息将有助于解释它失败的原因幸运的是,至少在ant 1.7.0中,您既不能在taskdef中使用sysproperty,也不能在目标中使用standalone。所以这不起作用。