0

我正在从命令行运行 maven

mvn exec:java -Dexec.mainClass=org.xmlcml.svg2xml.analyzer.DocumentListAnalyzer 
   -Dexec.args=.

当我的程序抛出一个 RuntimeException 时,maven 不会抛出这个而是抛出一个InvocationTargetException

java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.RuntimeException: Only one primary allowed for 3 line textL
ineGroup
        at org.xmlcml.svg2xml.text.TextLineGroup.createSuscriptTextLineList(Text
LineGroup.java:181)
        at org.xmlcml.svg2xml.text.TextLineGroup.createHtml(TextLineGroup.java:2
40)

运行 Eclipse 时不会发生这种情况。

为什么会这样?(这让我感到困惑,也让我的用户感到困惑)。

4

1 回答 1

3

调用方法告诉我们如下: -

反射提供了一种调用类方法的方法。通常,仅当无法在非反射代码中将类的实例强制转换为所需类型时,才需要这样做。

使用 调用方法java.lang.reflect.Method.invoke()第一个参数the object instance调用这个特定方法的位置。(如果方法是静态的,第一个参数应该为 null。)后续参数method's parameters.

如果底层方法抛出异常它将被一个java.lang.reflect.InvocationTargetException. 可以使用异常链接机制的InvocationTargetException.getCause()方法来检索方法的原始异常。

由于堆栈跟踪还告诉我们,exec:java也使用了Reflection。然后原始异常也被包装。请参考org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)的源代码以获取更多参考。

我希望这可能会有所帮助。

于 2013-04-12T08:52:01.270 回答