2013-12-20 9 views
6

Ich benutze das Maven exec plugin, um eine Java-Anwendung von der Kommandozeile aus mit dem Befehl mvn exec: java auszuführen. Ich habe die Hauptklasse in der pom.xml und den zugehörigen Abhängigkeiten angegeben.Maven exec plugin ClassNotFoundException

<groupId>com.example.MyApp</groupId> 
<artifactId>MyApp</artifactId> 
<version>1.0.0</version> 
<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
     <execution> 
      <goals> 
      <goal>java</goal> 
      </goals> 
     </execution> 
     </executions> 
     <configuration> 
      <mainClass>com.example.myclass</mainClass> 
      <arguments> 
      <argument>configFile</argument> 
      <argument>properties</argument> 
      </arguments> 
     </configuration> 
    </plugin> 

ich auch eine Reihe von Abhängigkeiten angeben ...

<dependencies> 
<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.17</version> 
    <type>jar</type> 
</dependency> 
<dependency> 
    <groupId>com.example.MyLibrary</groupId> 
    <artifactId>MyLibrary</artifactId> 
    <version>1.0.0</version> 
</dependency> 

Das MyApp Programm liest eine Konfigurationsdatei, die als Kommandozeilen-Argument übergeben wird. Die Konfigurationsdatei enthält den Namen einer Klasse, die sich in MyLibrary befindet. So könnte die Klasse com.mypackage.driver.MyClass sein, die sich in MyLibrary befindet, die eine Abhängigkeit von dem oben aufgeführten MyApp Krug ist. aber wenn ich versuche, dies zu laufen bekomme ich ein ClassNotFoundException ...

aktualisieren ---- ich das System Classloader bin mit den Klassen zu laden, die auf der Kommandozeile in dem MyApp Programm übergeben werden

ClassLoader loader = ClassLoader.getSystemClassLoader(); 

Ich denke, dass dies das Problem verursacht, da es nach den Klassen auf dem Standardklassenpfad sucht, der die Abhängigkeiten nicht enthält.

Irgendwelche Hinweise darauf, was ich hier falsch mache?

Antwort

12

Suchen Sie noch nach einer Antwort auf diese Frage? Ich hatte genau das gleiche Problem und habe es schließlich herausgefunden.

Sie benötigen includePluginDependencies Ihrer Konfiguration hinzuzufügen, um das Plugin Ihre Abhängigkeiten für die Hauptklasse suchen zu machen:

<configuration> 
    <includePluginDependencies>true</includePluginDependencies> 
    <mainClass>com.example.myclass</mainClass> 
    <arguments> 
    <argument>configFile</argument> 
    <argument>properties</argument> 
    </arguments> 
</configuration> 

Siehe hier: http://mojo.codehaus.org/exec-maven-plugin/java-mojo.html#includePluginDependencies

+0

Ich habe das gleiche Problem, hinzugefügt includePluginDependencies, noch ClassNotFoundException. Irgendwelche anderen Vorschläge? –

0

Sie können die Classpath lassen wie diese erhalten generiert:

<configuration> 
     <executable>java</executable> 
     <arguments> 
     <argument>-Dmyproperty=myvalue</argument> 
     <argument>-classpath</argument> 
     <!-- automatically creates the classpath using all project dependencies, 
      also adding the project build directory --> 
     <classpath/> 
     <argument>com.example.Main</argument> 
     ... 
     </arguments> 
    </configuration> 
+1

Hallo @Moritz Sie weiter näher darauf eingehen können, Ich hatte den Eindruck, dass, sobald ich mvn exec: java ausgeführt habe, die Abhängigkeiten, die von diesem Projekt definiert wurden, automatisch im Klassenpfad enthalten wären ... – Barry

0

Bevor von der Kommandozeile ausführen, sollten Sie auch in der Befehlszeile Ihrer Bibliothek importieren. Sie können diesen Befehl mit Ihrem expecific Namen und Informationen Ihrer Bibliothek verwenden:

mvn install:install-file -Dfile=MyLibrary.jar -DgroupId=com.example.MyLibrary -DartifactId=MyLibrary -Dversion=1.0.0 -Dpackaging=jar 
+1

Hallo Danke für die Antwort, das Jar befindet sich bereits in meinem lokalen Repository – Barry

0

Sie müssen die Abhängigkeit als Abhängigkeit der Ausführung Plugin hinzufügen, so dass die Ausführung Plugin die Klasse, die Sie com.example.myclass konfiguriert laden kann:

<plugins> 
<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    [...] 
    <dependencies> 
    <dependency> 
     <groupId>com.example.MyLibrary</groupId> 
     <artifactId>MyLibrary</artifactId> 
     <version>1.0.0</version> 
     <type>jar</type> 
    </dependency> 

</plugin> 
+0

Danke für die Antwort, ich habe die Abhängigkeit zum Plugin hinzugefügt, aber es gibt mir immer noch einen Klassenfehler. Ich habe dieses Beispiel hier http://mojo.codehaus.org/exec-maven-plugin/examples/example-exec-using-plugin-dependencies.html – Barry

Verwandte Themen