2013-04-08 15 views
5

Es ist ein Maven-basiertes Projekt, das von maven install gebaut werden kann, aber Exception werfen, wenn das aus Glas laufen:ClassNotFoundException in Maven Projekt

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/CommandLineParser 
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.CommandLineParser 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

Ich möchte wissen, warum Java nicht die Maven Abhängigkeit Bibliothek finden ?

<?xml version="1.0" encoding="UTF-8"?> 
<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.artofsolving.jodconverter</groupId> 
    <artifactId>jodconverter-core</artifactId> 
    <version>3.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>JODConverter - Core Library</name> 
    <description> 
    JODConverter converts office documents using OpenOffice.org 
    </description> 
    <url>http://jodconverter.googlecode.com</url> 
    <licenses> 
    <license> 
     <name>GNU Lesser General Public License, Version 3 or later</name> 
     <url>http://www.gnu.org/licenses/lgpl.html</url> 
    </license> 
    </licenses> 
    <scm> 
    <url>http://jodconverter.googlecode.com/svn/trunk/jodconverter-core</url> 
    <connection>scm:svn:https://jodconverter.googlecode.com/svn/trunk/jodconverter-core/</connection> 
    </scm> 
    <inceptionYear>2003</inceptionYear> 
    <developers> 
    <developer> 
     <id>mirko.nasato</id> 
     <name>Mirko Nasato</name> 
     <email>[email protected]</email> 
    </developer> 
    </developers> 
    <contributors> 
    <contributor> 
     <name>Shervin Asgari</name> 
     <email>[email protected]</email> 
    </contributor> 
    </contributors> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <repositories> 
    <repository> 
     <!-- required for org.hyperic:sigar --> 
     <id>jboss-public-repository-group</id> 
     <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url> 
    </repository> 
    </repositories> 

    <dependencies> 

    <!-- Required dependencies --> 

    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.openoffice</groupId> 
     <artifactId>juh</artifactId> 
     <version>3.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.openoffice</groupId> 
     <artifactId>ridl</artifactId> 
     <version>3.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.openoffice</groupId> 
     <artifactId>unoil</artifactId> 
     <version>3.2.1</version> 
    </dependency> 

    <dependency> 
     <!-- for the command line tool --> 
     <groupId>commons-cli</groupId> 
     <artifactId>commons-cli</artifactId> 
     <version>1.2</version> 
    </dependency> 

    <!-- Optional dependencies --> 


    <dependency> 
     <!-- for more robust process management --> 
     <groupId>org.hyperic</groupId> 
     <artifactId>sigar</artifactId> 
     <version>1.6.5.132</version> 
     <optional>true</optional> 
    </dependency> 
    <dependency> 
     <!-- for JSON configuration --> 
     <groupId>org.json</groupId> 
     <artifactId>json</artifactId> 
     <version>20090211</version> 
     <optional>true</optional> 
    </dependency> 

    <!-- Test dependencies --> 

    <dependency> 
     <groupId>org.testng</groupId> 
     <artifactId>testng</artifactId> 
     <version>6.0.1</version> 
     <scope>test</scope> 
    </dependency> 

    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.3.2</version> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
      <encoding>UTF-8</encoding> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.7.2</version> 
     <configuration> 
      <!-- don't run tests in parallel --> 
      <perCoreThreadCount>false</perCoreThreadCount> 
      <threadCount>1</threadCount> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3.1</version> 
     <configuration> 
      <archive> 
      <manifest> 
       <mainClass>org.artofsolving.jodconverter.cli.Convert</mainClass> 
       <addClasspath>true</addClasspath> 
      </manifest> 
      </archive> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/dist.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

    <reporting> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-javadoc-plugin</artifactId> 
     <version>2.7</version> 
     </plugin> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>cobertura-maven-plugin</artifactId> 
     <version>2.4</version> 
     </plugin> 
    </plugins> 
    </reporting> 

</project> 
+0

Wie läuft es? Und was ist der Ordner/die Dateistruktur von wo Sie es ausführen? – NilsH

+0

@NilsH 'java -jar Ziel/JODConverter-Core-3.0-SNAPSHOT.jar' – why

+0

Und das Projekt ist https://github.com/mirkonasato/jodconverter – why

Antwort

5

Wenn Ihr Glas mit java -jar läuft, sind Sie nicht mehr mit dem Maven läuft von Abhängigkeiten zu lösen. Sie müssen sicherstellen, dass alle Gläser, auf die Sie angewiesen sind, in der relativen Position verfügbar sind, die in der MANIFEST.mf Datei in Ihrem Glas angegeben ist. Normalerweise würden Sie das Assembly-Plugin verwenden, um ein verteilbares Archiv zu erstellen, das diese Struktur erstellt. Oder Sie könnten ein Überjar/Onejar-Plugin verwenden, um alles in Ihr Jar aufzunehmen.

+0

Dank hat gesetzt, cobertura- maven-plugin kann mir helfen – why

+0

Hallo, könnten Sie mir bitte noch eine ähnliche Frage stellen? http://stackoverflow.com/questions/15862628/org-hyperic-sigar-sigarexception-no-libsigar-universal64-macosx-dylib-in -java-l – why

4

Sie haben 2 Möglichkeiten, dies zu beheben:

Option 1 - beiden Plugins unter Abhängigkeiten zu einem „lib“ Ordner kopieren (siehe ausgabe) und Ihre Runnable JAR machen wissen, wo sie sind (siehe classpathPrefix)

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-jar-plugin</artifactId> 
<configuration> 
    <archive> 
     <manifest> 
      <addClasspath>true</addClasspath> 
      <classpathPrefix>lib/</classpathPrefix> 
      <mainClass>example.MyMainClass</mainClass> 
     </manifest> 
    </archive> 
</configuration> 
</plugin> 

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-dependency-plugin</artifactId> 
<executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>package</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      <overWriteReleases>false</overWriteReleases> 
      <overWriteSnapshots>false</overWriteSnapshots> 
      <overWriteIfNewer>true</overWriteIfNewer> 
     </configuration> 
    </execution> 
</executions> 


Option 2 - Verwenden Sie maven-assembly-plugin, um ein einzelnes JAR mit allen Abhängigkeiten zu erstellen. (Alle Abhängigkeiten werden extrahiert und komprimiert zusammen in der gleichen JAR)

<assembly 
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

<id>with-dependencies</id> 
<formats> 
    <format>jar</format> 
</formats> 
<includeBaseDirectory>false</includeBaseDirectory> 
<dependencySets> 
    <dependencySet> 
     <outputDirectory>/</outputDirectory> 
     <useProjectArtifact>true</useProjectArtifact> 
     <unpack>true</unpack> 
     <scope>compile</scope> 
    </dependencySet> 
</dependencySets> 

0

ich das Problem gesehen habe, auch. Cobertura erstellt instrumentierte Kopien aller kompilierten Klassendateien (in Ziel/Klassen) durch Bytecode-Manipulation. Meine JAR-Datei enthielt die instrumentierten Klassendateien (aus target/generated-classes/cobertura), aber cobertura.jar fehlte. Also, ClassNotFoundException war die richtige Reaktion.

Da mein POM jedoch keine Hinweise enthält, welche die vorgesehenen Klassen für die Verpackung sind, hat Maven die freie Wahl ... und es verwendet den instrumentierten Satz von Dateien.

Meine Lösung war wirklich einfach: MVN sauber und MVN-Paket. Der erste Aufruf entfernt alle instrumentierten Klassen. Dann findet der zweite Aufruf nur die uninstrumentierten Klassen ohne externe Referenzen auf Cobertura.

Verwandte Themen