2013-04-12 6 views
0

Я бег Maven из командной строкиПочему maven бросает InvocationTargetException?

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

Когда моя программа бросает RuntimeException, специалист не бросает это, но бросает 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.

Почему это происходит? (Меня это смутило и смущает моих пользователей).

+0

Как насчет исключения RuntimeException в трассировке стека? –

+0

@Andrew Да, это исключение, которое я выбрал, и это последнее сообщенное исключение в Eclipse. Что меня смутило, что я думал, что MY-код каким-то образом бросает 'InvocationTargetException'. Имеет ли тот факт, что maven использует отражение, вызывает какие-либо проблемы? –

+0

Из исходного кода плагина 'exec' ясно, что он использует отражение для запуска вашего основного класса. Если что-то пойдет не так (ваш метод выдает исключение, например), он распространяется до основного потока maven и заверяется в 'InvocationTargetException'. Комментарий от @Charlee объясняет это. –

ответ

3

Invoking Methods рассказал нам, как: -

Отражение обеспечивает средство для вызова методов в классе. Как правило, это было бы необходимо только в том случае, если невозможно отличить экземпляр класса к желаемому типу в неотражающем коде.

Способы вызываются с java.lang.reflect.Method.invoke(). Первый аргумент - это the object instance, на который должен быть вызван этот конкретный метод. (Если метод статичен, первый аргумент должен быть пустым.) Последующие аргументы - это method's parameters.

Если базовый метод вызывает исключение, он будет обернутjava.lang.reflect.InvocationTargetException. Исходное исключение метода может быть получено с использованием метода механизма цепочки исключений.

Поскольку StackTrace также сказал нам, что exec:java также использует Reflection, а также. Тогда исходное исключение также завернуто. Для получения дополнительной информации обратитесь к исходному коду: org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297).

Надеюсь, это поможет.

Смежные вопросы