1

ich Maven lerne, aber ich bin vor Problem Abhängigkeiten in dem Import folgende Datei mein pom.xml istclassNotFund Fehler von 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> 

Folgende ist meine Java-Datei

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(); 
    } 
} 

I zusammengestellt mit mvn kompilieren und erstellt Krug mit MVN-Paket beide ohne Fehler ausgeführt. aber wenn ich Anwendung ausführen mit dem Befehl

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

es zeigt folgende Fehler

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

mvn Befehl auszuführen Das bedeutet Maven nicht, dass die JAR bringen für Ihr Projekt oder es ist nicht richtig verpackt. Fang mit dem Letzten an. – duffymo

+0

Haben Sie Fehler beim Verpacken? –

Antwort

2

Grund, warum es gibt noclassfound Fehler ist, dass, wenn Sie es verpacken, ist es nicht eine Fett/uber nicht schafft jar und jar Datei, in der FTPClient vorhanden ist, das ist nicht Teil Ihrer myapp-1.0-SNAPSHOT.jar, daher erhalten Sie noclassfounderror.

Maven Assembly Plugin hilft Ihnen, ein fettes Glas zu erstellen (enthält die Abhängigkeit) Glas und schafft ein lauffähiges Glas, in dem Sie Ihre FQCN von Main Methode geben. Daher, wenn Sie das Fettglas laufen lassen, wird es alle Abhängigkeiten haben und Ihr Programm wird gut laufen.

Fügen Sie unter plugin in Ihre pom.xml ein und führen Sie den Befehl mvn package aus.

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

Hinweis: - ändert den Mainclass mit vollständig qualifizierten Klassennamen von Ihnen.

Lassen Sie mich wissen, wenn es nicht funktioniert.

0

ich in der Lage bin Problem zu lösen einige Code pom.xml hier ist das Hinzufügen der Code I

hinzugefügt
<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> 

Nach dem Kompilieren und Ausführen des Projekts es perfekt läuft.

Wenn ich mvn compile verwende, kompiliert es nur meine Hauptklasse, aber es kombiniert keine Abhängigkeiten. Deshalb, wenn ich versuche, JAR-Datei ausführen es ClassNotFound Fehler geben, denn diese müssen Sie mvn plugin copy-dependencies hinzuzufügen und Ausführung Tag hinzufügen copy-dependencies

+0

Sie sollten verstehen, warum Sie ein bestimmtes Stück Code hinzufügen und was der Grund für den Fehler war. Ich erklärte, dass es in meiner Antwort, bitte versuche es und lass es mich wissen. –

+0

Entschuldigung dafür, ich habe meine Erklärung bearbeitet – AviatorX