Не удалось выполнить цель org.codehaus.mojo exec-maven-plugin при чтении файла config.xml
Мой код работает, когда я запускаю его как java-приложение в eclipse, но он не работает, когда я запускаю maven install с подключаемым модулем maven-exec. Я знаю, что это не удается, потому что он не находит файл конфигурации, но как?
Если я исключу плагин maven-exec, он будет успешно собран, и я смогу выполнить свой jar-файл с зависимостями.
public class App
{
public static void main( String[] args )
{
System.out.println( "... starting DomParser" );
System.out.println( "... inside app" );
DOMParser.loadXML("/config.xml");
System.out.println( "... ending DomParser" );
}
}
Вот упрощенный класс DomParser
static SAXBuilder builder = new SAXBuilder();
static Document doc;
public static void loadXML(String path) {
java.net.URL url = DOMParser.class.getClass().getResource(path);
doc = builder.build(url);
root = doc.getRootElement();
}
Это pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ericsson.ci.simnet</groupId>
<artifactId>domparser</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>domparser</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.5</version>
</dependency>
</dependencies>
<build>
<!-- <finalName>${project.name}</finalName> -->
<plugins>
<!-- Tell maven to compile using Java 1.7 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.x.ci.simnet.domparser.App</mainClass>
<arguments>
<argument></argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
<!-- to bundle necessary classes of dependent JAR files -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.x.ci.simnet.domparser.App</mainClass>
</transformer>
</transformers>
<!--<shadedArtifactAttached>true</shadedArtifactAttached> -->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Ошибка здесь:
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:java (default) on project domparser: An exception occured while executing the Java class. null: InvocationTargetException: NullPointerException -> [Help 1]
1 ответ
После долгих часов ночи я нашел решение. Спасибо всем за помощь.
Я заменил мой код класса DomParser, как показано ниже
import org.jdom2.input.SAXBuilder;
import org.jdom2.Document;
public class DOMParser {
static SAXBuilder builder = new SAXBuilder();
static Document doc;
...
...
public static void loadXML(String path) {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
java.net.URL url = classLoader.getResource(path);
doc = builder.build(url);
root = doc.getRootElement();
}
Итак, ключевым трюком было использование следующей строки кода.
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Это позволяет вам запускать ваше приложение следующими способами
- Eclipse > Запуск от имени приложения Java
- плагин maven exec
- исполняемый кувшин с заглушкой maven
Я надеюсь, что это поможет другим людям иметь аналогичную проблему в будущем.
ОБНОВИТЬ:
Я забыл упомянуть, что я также немного изменил код класса App. Всего одна строчка. Я передаю файл anme без косой черты, как показано ниже.
DOMParser.loadXML("config.xml");