2017-04-21 80 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