Ant 将堆栈跟踪放在标准输出中
Ant places stacktraces in standard output
我正在使用 Ant 以及我自己创建的任务。
当这些自定义 ant 任务失败时,它们的输出将重定向到标准输出。
我希望将它们重定向到 stderr。
一个简单的全通用 Ant 示例是:
<project name="test" default="init" basedir=".">
<!-- Initialise project parameters -->
<target name="init">
<echo message="This is error message." level="error" />
</target>
</project>
正确输出 "This is error message" 到 stderr 可以看到:
Buildfile: /home/jll/Downloads/loggingerror.xml
init:
[echo] Something wrong here.
**[echo] This is error message.**
BUILD SUCCESSFUL
Total time: 0 seconds
粗体行在Eclipse中显示为红色,表示在错误标准输出中。
现在,当我 运行 我的自定义 ant 文件时:
<project name="test2" default="init" basedir=".">
<taskdef resource="resource/customtasks.properties" />
<target name="init" >
<log
scriptid="S4"
message="Initialising Project Parameters."
min="0"
max="5"/>
</target>
</project>
运行 这预计会因 NullPointerException 而失败。
输出确实如预期所示:
Trying to override old definition of task import
init:
[log] java.lang.NullPointerException
.......
[log] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
[log] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[log] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[log] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[log] at java.lang.reflect.Method.invoke(Method.java:606)
[log] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[log] at org.apache.tools.ant.Task.perform(Task.java:348)
[log] at org.apache.tools.ant.Target.execute(Target.java:435)
[log] at org.apache.tools.ant.Target.performTasks(Target.java:456)
[log] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
[log] at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
[log] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[log] at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
[log] at org.apache.tools.ant.Main.runBuild(Main.java:851)
[log] at org.apache.tools.ant.Main.startAnt(Main.java:235)
[log] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
[log] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
BUILD SUCCESSFUL
Total time: 0 seconds
但在这种情况下,所有内容都会输出到标准输出。为什么?
我的 Java 在自定义任务中抛出异常的代码非常简单:
@Override
public void execute() throws BuildException {
try {
stuff....
}
catch (Exception e) {
throw new BuildException(e);
}
}
我也一直在尝试 fiddle e.printStackTrace() 和 logger.error("message", e) 在我的 java 代码中,到目前为止没有成功。即使显示错误,行为也保持不变(所有内容都发送到标准输出)。
有什么方法可以查看我的堆栈跟踪信息,或者至少是 stderr 中的某种错误消息?
谢谢
我认为这不可能。
如果您没有太多 classes,最接近的解决方案是通过执行与所描述的类似的操作将每个 class 的输出重定向到一个文件 (stderr)
here.
然而他们也想重定向标准输出,但你可以试试这个:
<java classname="some.package.Class"
output="stderr.txt">
...
</java>
然而,这并不是真正将其定向到 stderr,但它很接近。
您可以实现与 Echo 任务中相同的代码
import java.io.IOException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.util.ResourceUtils;
import org.apache.tools.ant.types.resources.LogOutputResource;
import org.apache.tools.ant.types.resources.StringResource;
public class MyLogTask extends Task {
private String msg;
public void execute() throws BuildException {
try {
ResourceUtils.copyResource(new StringResource(msg), new LogOutputResource(this, Project.MSG_ERR),
null, null, false, false, true, null, null, getProject(), true);
} catch (IOException ioe) {
throw new BuildException(ioe, getLocation());
}
}
public void setMessage(String msg) {
this.msg = msg;
}
}
然后消息转到stderr
<project default="main">
<taskdef name="mylog" classname="MyLogTask"/>
<target name="main">
<echo message="ERROR" level="error" />
<mylog message="hello"/>
</target>
</project>
这是测试:
/cygdrive/c/temp/ant>ant
Buildfile: c:\temp\ant\build.xml
main:
[echo] ERROR
[mylog] hello
BUILD SUCCESSFUL
Total time: 0 seconds
/cygdrive/c/temp/ant>ant 2>err
Buildfile: c:\temp\ant\build.xml
main:
BUILD SUCCESSFUL
Total time: 0 seconds
/cygdrive/c/temp/ant>
我正在使用 Ant 以及我自己创建的任务。 当这些自定义 ant 任务失败时,它们的输出将重定向到标准输出。
我希望将它们重定向到 stderr。
一个简单的全通用 Ant 示例是:
<project name="test" default="init" basedir=".">
<!-- Initialise project parameters -->
<target name="init">
<echo message="This is error message." level="error" />
</target>
</project>
正确输出 "This is error message" 到 stderr 可以看到:
Buildfile: /home/jll/Downloads/loggingerror.xml
init:
[echo] Something wrong here.
**[echo] This is error message.**
BUILD SUCCESSFUL
Total time: 0 seconds
粗体行在Eclipse中显示为红色,表示在错误标准输出中。
现在,当我 运行 我的自定义 ant 文件时:
<project name="test2" default="init" basedir=".">
<taskdef resource="resource/customtasks.properties" />
<target name="init" >
<log
scriptid="S4"
message="Initialising Project Parameters."
min="0"
max="5"/>
</target>
</project>
运行 这预计会因 NullPointerException 而失败。
输出确实如预期所示:
Trying to override old definition of task import
init:
[log] java.lang.NullPointerException
.......
[log] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
[log] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[log] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[log] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[log] at java.lang.reflect.Method.invoke(Method.java:606)
[log] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[log] at org.apache.tools.ant.Task.perform(Task.java:348)
[log] at org.apache.tools.ant.Target.execute(Target.java:435)
[log] at org.apache.tools.ant.Target.performTasks(Target.java:456)
[log] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
[log] at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
[log] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[log] at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
[log] at org.apache.tools.ant.Main.runBuild(Main.java:851)
[log] at org.apache.tools.ant.Main.startAnt(Main.java:235)
[log] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
[log] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
BUILD SUCCESSFUL
Total time: 0 seconds
但在这种情况下,所有内容都会输出到标准输出。为什么?
我的 Java 在自定义任务中抛出异常的代码非常简单:
@Override
public void execute() throws BuildException {
try {
stuff....
}
catch (Exception e) {
throw new BuildException(e);
}
}
我也一直在尝试 fiddle e.printStackTrace() 和 logger.error("message", e) 在我的 java 代码中,到目前为止没有成功。即使显示错误,行为也保持不变(所有内容都发送到标准输出)。
有什么方法可以查看我的堆栈跟踪信息,或者至少是 stderr 中的某种错误消息?
谢谢
我认为这不可能。
如果您没有太多 classes,最接近的解决方案是通过执行与所描述的类似的操作将每个 class 的输出重定向到一个文件 (stderr) here.
然而他们也想重定向标准输出,但你可以试试这个:
<java classname="some.package.Class"
output="stderr.txt">
...
</java>
然而,这并不是真正将其定向到 stderr,但它很接近。
您可以实现与 Echo 任务中相同的代码
import java.io.IOException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.util.ResourceUtils;
import org.apache.tools.ant.types.resources.LogOutputResource;
import org.apache.tools.ant.types.resources.StringResource;
public class MyLogTask extends Task {
private String msg;
public void execute() throws BuildException {
try {
ResourceUtils.copyResource(new StringResource(msg), new LogOutputResource(this, Project.MSG_ERR),
null, null, false, false, true, null, null, getProject(), true);
} catch (IOException ioe) {
throw new BuildException(ioe, getLocation());
}
}
public void setMessage(String msg) {
this.msg = msg;
}
}
然后消息转到stderr
<project default="main">
<taskdef name="mylog" classname="MyLogTask"/>
<target name="main">
<echo message="ERROR" level="error" />
<mylog message="hello"/>
</target>
</project>
这是测试:
/cygdrive/c/temp/ant>ant
Buildfile: c:\temp\ant\build.xml
main:
[echo] ERROR
[mylog] hello
BUILD SUCCESSFUL
Total time: 0 seconds
/cygdrive/c/temp/ant>ant 2>err
Buildfile: c:\temp\ant\build.xml
main:
BUILD SUCCESSFUL
Total time: 0 seconds
/cygdrive/c/temp/ant>