为什么maven抛出InvocationTargetException?

时间:2013-04-12 08:35:06

标签: java maven invocationtargetexception

我正在从命令行运行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时不会发生这种情况。

为什么会这样? (它使我感到困惑并使我的用户感到困惑)。

1 个答案:

答案 0 :(得分:3)

Invoking Methods告诉我们如下: -

  

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

     使用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)的源代码以获取进一步的参考。

我希望这可能有所帮助。