2017-04-21 81 views
1

我學習行家,但我對進口的依賴,下面面臨的問題是我的pom.xml文件maven的classNotFound錯誤?

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

以下是我的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(); 
    } 
} 

我使用MVN編譯編譯和創建罐子使用mvn包裝都執行沒有任何錯誤。但是當我運行使用應用程序命令

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

它顯示下列錯誤

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

這意味着Maven的沒有把該JAR下您的項目,或者它不是正確包裝。從後者開始。 – duffymo

+0

包裝時是否有錯誤? –

回答

2

它之所以給人noclassfound的錯誤是,當你將其打包,它不創建一個脂肪/超級 jar和jar文件,其中FTPClient存在,這不是您的myapp-1.0-SNAPSHOT.jar的一部分,因此您可以獲得noclassfounderror

的Maven Assembly插件幫助您創建一個胖罐子(包括相關性)的容器,並創建一個可運行的罐子,你給你的Main方法FQCN。因此,當你運行fat jar時,它將擁有所有的依賴關係,並且你的程序將運行良好。

將下面的插件包含在您的pom.xml中並運行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> 

注: - 在這裏改變mainclass與你的完全限定類名。

讓我知道它是否無效。

0

我能夠解決問題添加一些代碼pom.xml這裏是我加

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

編譯並運行它運行完美的項目後的代碼。

當我使用mvn compile它只是編譯我的主類,但它沒有組合依賴關係。這就是爲什麼當我試圖運行它給錯誤ClassNotFound JAR文件,對於這一點,你需要添加mvn plugin copy-dependencies,並添加執行標籤執行MVN指令copy-dependencies

+0

你應該明白爲什麼你要添加特定的代碼,錯誤背後的原因是什麼。我解釋說,在我的回答中,請試一試,讓我知道。 –

+0

對不起,我編輯了我的解釋 – AviatorX