java - maven 的 classNotFound 错误?

标签 java import maven-2 noclassdeffounderror maven-dependency

我正在学习 maven,但在导入依赖项时遇到问题,以下是我的 pom.xml 文件

<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 编译 并使用 创建了 jar 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

最佳答案

它给出的原因noclassfound错误在于,当您打包它时,它不会创建 脂肪/ super jar 和 jar 文件,其中 FTPClient存在,这不属于您的 myapp-1.0-SNAPSHOT.jar ,因此你得到 noclassfounderror .

Maven 组装插件 帮助您创建一个胖 jar(包括依赖项)jar 并创建一个可运行的 jar,您可以在其中提供您的 FQCN Main方法。因此,当您运行胖 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>

注意:- 这里更改 主类使用您的完全限定类名。

如果它不起作用,请告诉我。

关于java - maven 的 classNotFound 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43542951/

相关文章:

java - 在Java中更改导入名称,或导入两个同名的类

javascript - 代码未在 Javascript 模块类型脚本源内执行 [ES6]

java - 如何在 Maven 2 exec 插件的参数中使用空格

maven-2 - Maven - 添加对工件源的依赖

java - 如何读取部署在Tomcat中的未分解war文件中的资源文件?

Java 泛型。 child 延伸 parent

java - 三次贝塞尔曲线 : Maximum Gradient and Collision Avoidance?

java - 交换没有临时变量的字符串值

java - 在 OSGI 应用程序 Mac OS X - Java 1.7 中引用时 ImageIO 挂起

javascript - `import username from ' ./username.txt '` 与 typescript+webpack 给出 `undefined`