2012-05-12 11 views
40

Il mio primo utilizzo di Maven e I sono bloccato con dipendenze.NoClassDefFoundError sulla dipendenza da Maven

Ho creato un progetto Maven con Eclipse e aggiunto dipendenze e funzionava senza problemi.

Ma quando provo a farlo funzionare tramite linea di comando:

$ mvn package # successfully completes 
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App # NoClassDefFoundError for dependencies 

che scarica le dipendenze, costruisce con successo, ma quando provo a farlo funzionare, ottengo NoClassDefFoundError:

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonParseException 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:16) 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:22) 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.App.main(App.java:10) 
Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.JsonParseException 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
     ... 3 more 

mio pom XML è come questo:

<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>tr.edu.hacettepe.cs.b21127113</groupId> 
    <artifactId>bil138_4</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>bil138_4</name> 
    <url>http://maven.apache.org</url> 

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

    <dependencies>   
    <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId>   
    </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId>    
     </dependency> 
    </dependencies> 
    <dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    </dependencies> 
    </dependencyManagement> 
</project> 

qualcuno mi può aiutare?

risposta

16

when I try to run it, I get NoClassDefFoundError

Eseguire come? Probabilmente stai provando a eseguirlo con eclipse senza aver importato correttamente il tuo classpath maven. Vedi il plugin m2eclipse per integrare Maven con Eclipse.

per verificare che la configurazione di Maven è corretto, è possibile eseguire la vostra applicazione con il exec plugin utilizzando:

mvn exec:java -D exec.mainClass=<your main class> 

Aggiornamento: In primo luogo, per quanto riguarda il tuo errore durante l'esecuzione exec:java, la classe principale è tr.edu.hacettepe.cs.b21127113.bil138_4.App. Quando si parla di nomi di classi, sono (quasi) sempre separati da punti. Il nome semplice della classe è solo l'ultima parte: App nel tuo caso. Il nome completo è il pacchetto completo più il nome semplice della classe, ed è ciò che dai a maven o java quando vuoi eseguire qualcosa. Quello che stavi cercando di usare era un percorso del file system verso un file sorgente. Questa è una bestia completamente diversa. Un nome di classe generalmente si traduce direttamente in un file di classe che si trova nel percorso classe, rispetto a un file sorgente nel file system. Nel tuo caso specifico, il file di classe in questione sarebbe probabilmente a target/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class perché Maven viene compilato su target/classes e java crea tradizionalmente una directory per ogni livello di packaging.

Il tuo problema originale è semplicemente che non hai messo i barattoli di Jackson sul tuo percorso di classe. Quando esegui un programma java dalla riga di comando, devi impostare il percorso della classe per far sapere dove può caricare le classi. Hai aggiunto il tuo barattolo, ma non gli altri richiesti. Il tuo commento mi fa pensare che non capisci come creare manualmente un percorso di classe. In breve, il percorso della classe può avere due cose: le directory che contengono i file di classe e i jar contenenti i file di classe. Le directory contenenti i barattoli non funzioneranno. Per ulteriori dettagli sulla creazione di un percorso di classe, vedere "Setting the class path" e la documentazione dello strumento java e javac.

tuo percorso di classe avrebbe bisogno di essere almeno, e senza la linea alimenta:

target/bil138_4-0.0.1-SNAPSHOT.jar: 
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.6/jackson-core-asl-1.9.6.jar: 
/home/utdemir/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.6/jackson-mapper-asl-1.9.6.jar 

Si noti che il separatore su Windows è un punto e virgola (;).

Mi scuso per non averlo notato prima. Il problema era seduto lì nel tuo post originale, ma l'ho perso.

+0

Ottenere questo errore: http://pastebin.com/g2txkMY6. Posso eseguirlo su eclipse con il plugin m2eclipse, ho sviluppato l'applicazione su di esso. Non riesco a capire come eseguirlo tramite la riga di comando. E come importare il mio classpath maven? Modifica: provato con l'aggiunta di -classpath /home/utdemir/.m2/repository/ parametro al comando java, ancora senza fortuna. – utdemir

+1

Aggiornato la mia risposta. –

+0

Grazie. Impostando il classpath come hai detto risolvi il problema, contrassegnando la domanda come risolta.Ma ho ancora qualche domanda: 1- Perché non devo aggiungere Jackson al classpath per il plugin exec? 2- Il plug-in Exec richiede che il mio progetto sia compilato, quindi avrei dovuto eseguire mvn compile o pacchetto, giusto? 3- Questo codice è il mio compito, è l'aggiunta di librerie nei loro classpath è la loro responsabilità, o devo fare qualcosa al riguardo? – utdemir

80

Per impostazione predefinita, Maven non raggruppa le dipendenze nel file JAR che genera e non le fornisce sul classpath quando stai tentando di eseguire il file JAR sulla riga di comando. Questo è il motivo per cui la VM Java non riesce a trovare i file di classe della libreria quando tenta di eseguire il codice.

È possibile specificare manualmente le librerie sul classpath con il parametro -cp, ma questo diventa fastidioso rapidamente.

Una soluzione migliore è "sfumare" il codice della libreria nel file JAR di output. C'è un plugin Maven chiamato maven-shade-plugin per fare questo. Devi registrarlo nel tuo POM e costruirà automaticamente un "uber-JAR" contenente le tue classi e le classi per il tuo codice libreria anche quando esegui mvn package.

di riunire semplicemente tutte le librerie necessarie, aggiungere il seguente al vostro POM:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.6</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

Una volta fatto questo, è possibile eseguire di nuovo i comandi utilizzati in precedenza:

$ mvn package 
$ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App 

se si desidera effettuare un'ulteriore configurazione del plug-in per lo schermo in termini di quali JAR devono essere inclusi, specificando una Main-Class per un file JAR eseguibile e così via, vedere la sezione "Esempi" su maven-shade-plugin site.

+3

Nel caso qualcuno incontri questa risposta, qui è dove puoi ottenere una versione attuale del plugin, perché 1.6 è piuttosto vecchio ora: http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade -plugin – Scadge

2

È necessario creare classpath nel file pom per la propria dipendenza. quindi devi copiare tutte le dipendenze in un unico posto.

controllare il mio blog. http://madhawagunasekara.blogspot.com/2014/10/solving-javalangnoclassdeffounderror-in.html

<build> 
 
    <plugins> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-dependency-plugin</artifactId> 
 
    <version>2.1</version> 
 
    <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> 
 
    </plugin> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-jar-plugin</artifactId> 
 
    <version>2.4</version> 
 
    <configuration> 
 
    <archive> 
 
     <manifest> 
 
     <addClasspath>true</addClasspath> 
 
     <classpathPrefix>lib/</classpathPrefix> 
 
     <mainClass>$fullqualified path to your main Class</mainClass> 
 
     </manifest> 
 
    </archive> 
 
    </configuration> 
 
    </plugin> 
 
    
 
    </plugins> 
 
    
 
    
 
</build>

-2

Scegliere di Progetto -> Clean dovrebbe risolvere questo

2

Ciò è dovuto al Morphia vaso non essere parte della vostra guerra uscita/vaso. Eclipse o build locale li include come parte di classpath, ma build remote o build auto/pianificate non li considerano parte di classpath.

È possibile includere giare dipendenti utilizzando il plug-in.

Aggiungi al di sotto frammento nella sezione plugin del pom

<plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>3.0.0</version> 
     <configuration> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
-1

Nel mio caso, i binari Maven sono stati collocati in una cartella protetta nel mio portatile aziendale (Program Files \ Maven), causando problemi Maven per tirare/salvare le dipendenze repository, quindi dipendenze non si trovano (NoClassDefFoundError)

Il posto giusto Maven in c: \ Maven

Instructions

+0

Questa risposta non ha nulla a che fare con la domanda dell'OP. – shiri

+0

Nel mio caso, l'errore era lo stesso: NoClassDefFoundError Il motivo alla base: le dipendenze Java del progetto non sono state trovate; Maven non era in grado di creare/gestire correttamente il repository. Questo errore è scomparso dopo aver applicato questa soluzione, condivisa sopra ... @shiri Come puoi affermare che la mia risposta non ha nulla a che fare con la domanda allora ?? – cepix

Problemi correlati