2013-04-08 22 views
5

C'è un progetto basato Maven, che può essere costruito da maven install, ma un'eccezione tiro quando esegue il vaso out:ClassNotFoundException nel progetto Maven

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) 

Voglio sapere perché Java non riesce a trovare la libreria Maven dipendenze ?

<?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

Come lo gestisci? E qual è la struttura della cartella/file da dove viene eseguita? – NilsH

+0

@NilsH 'java -jar target/jodconverter-core-3.0-SNAPSHOT.jar' – why

+0

E il progetto è https://github.com/mirkonasato/jodconverter – why

risposta

5

Quando si esegue il Vaso con java -jar, non sei più in esecuzione con l'esperto di risolvere delle dipendenze. Devi assicurarti che tutti i barattoli da cui dipendi siano disponibili nella relativa giacitura indicata nel file MANIFEST.mf nel tuo Jar. In genere, si utilizza il plug-in di assembly per creare un archivio distribuibile che crea questa struttura. Oppure potresti usare un plugin uberjar/unjar per includere tutto all'interno del tuo Jar.

+0

Grazie, cobertura- maven-plugin mi può aiutare – why

+0

Ciao, potresti per favore controllarmi un'altra domanda simile? http://stackoverflow.com/questions/15862628/org-hyperic-sigar-sigarexception-no-libsigar-universal64-macosx-dylib-in -java-l – why

4

hai 2 opzioni per risolvere questo:

Opzione 1 - utilizzare entrambi i plugin di seguito per copiare le dipendenze in una cartella "lib" (vedi OutputDirectory) e rendere il vostro JAR Runnable sa dove sono (vedere 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> 


Opzione 2 - Usa il plugin maven-assembly-per creare un singolo JAR con tutte le dipendenze incluse. (Tutte le dipendenze vengono estratti e compressi insieme nella stessa 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

Ho visto il problema, anche. Cobertura crea copie strumentate di tutti i file di classe compilati (in target/classi) mediante la manipolazione bytecode. Il mio file jar conteneva i file di classe instrumentati (da target/generate-classes/cobertura), ma mancava cobertura.jar. Quindi, ClassNotFoundException era la reazione giusta.

Tuttavia, poiché il mio POM non contiene alcun suggerimento, che sono le classi previste per il packaging, Maven ha la libera scelta ... e utilizza il set di file strumentato.

La mia soluzione era davvero semplice: pacchetto mvn clean e mvn. La prima chiamata rimuove tutte le classi strumentate. Quindi, la seconda chiamata trova solo le classi non strutturate senza riferimenti esterni a Cobertura.

Problemi correlati