1

J'apprends maven mais je suis face à problème dans les dépendances d'importation, suivant mon fichier pom.xmlerreur classNotFound par maven?

<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>com.myapp.app</groupId> 
    <artifactId>myapp</artifactId> 
<packaging>jar</packaging> 
<version>1.0-SNAPSHOT</version> 
<name>myapp</name> 
<url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>commons-net</groupId> 
     <artifactId>commons-net</artifactId> 
     <version>3.3</version> 
    </dependency> 
    </dependencies> 
</project> 

Après mon fichier java

import org.apache.commons.net.ftp.FTPClient; 

public class App 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Hello World!"); 
     FTPClient ftp = new FTPClient(); 
    } 
} 

Je compilé en utilisant mvn compiler et créé jar en utilisant package mvn tous deux exécutés sans aucune erreur. mais quand je lance l'application en utilisant la commande

java -cp target/myapp-1.0-SNAPSHOT.jar com.myapp.app.App 

il montrant les erreurs suivantes

Hello World! 
Exception in thread "main" java.lang.NoClassDefFoundError: 
org/apache/commons/net/ftp/FTPClient 
     at com.myapp.app.App.main(App.java:16) 
Caused by: java.lang.ClassNotFoundException: 
org.apache.commons.net.ftp.FTPClient 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 1 more 
+0

Cela signifie Maven n'a pas apporté que JAR vers le bas pour votre projet ou il est pas emballé correctement. Commencez avec ce dernier. – duffymo

+0

avez-vous des erreurs lors de l'emballage? –

Répondre

2

Raison pour laquelle il donne l'erreur noclassfound est que, lorsque vous emballez, il ne crée pas de graisse /uber fichier jar et jar dans lequel FTPClient est présent, cela ne fait pas partie de votre myapp-1.0-SNAPSHOT.jar, d'où vous obtenez noclassfounderror.

plugin Maven Assembly vous aide à créer un pot pot de graisse (y compris la dépendance) et crée un pot runnable, où vous donnez votre FQCN de la méthode Main. Par conséquent, lorsque vous exécutez le gros pot, il aura toutes les dépendances et votre programme fonctionnera bien.

Incluez ci-dessous le plugin dans votre commande pom.xml et exécutez la commande mvn package.

<!-- Maven Assembly Plugin --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.4.1</version> 
       <configuration> 
        <!-- get all project dependencies --> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
        <!-- MainClass in mainfest make a executable jar --> 
        <archive> 
         <manifest> 
         <mainClass>com.myapp.app.App</mainClass> 
         </manifest> 
        </archive> 

       </configuration> 
       <executions> 
        <execution> 
        <id>make-assembly</id> 
             <!-- bind to the packaging phase --> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        </execution> 
       </executions> 
      </plugin> 

Note: - ici changer le MainClass avec le nom de classe complet de la vôtre. Faites-moi savoir si cela ne fonctionne pas.

0

Je suis en mesure de résoudre le problème en ajoutant un code à pom.xml ici est le code que j'ajouté

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <configuration> 
      <archive> 
       <manifest> 
        <addClasspath>true</addClasspath> 
        <classpathPrefix>dependency/</classpathPrefix> 
        <mainClass>com.example.MainClass</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> 
        <useBaseVersion>false</useBaseVersion> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 

Après la compilation et l'exécution du projet, il fonctionne parfaitement.

Lorsque j'utilise mvn compile, il ne fait que compiler ma classe principale mais il ne combine pas de dépendances. Voilà pourquoi quand je suis en train d'exécuter le fichier JAR il est donne erreur ClassNotFound, pour cela, vous devez ajouter mvn plugin copy-dependencies et ajouter un tag d'exécution pour exécuter la commande mvn copy-dependencies

+0

vous devez comprendre pourquoi vous ajoutez un morceau particulier de code et quelle était la raison de l'erreur. J'ai expliqué que dans ma réponse, s'il vous plaît essayer et laissez-moi savoir. –

+0

désolé pour cela, j'ai édité mon explication – AviatorX