Java maven没有发现classNotFound错误?
我正在学习maven,但在导入依赖项时遇到了问题,下面是我的pom.xml文件Java maven没有发现classNotFound错误?,java,import,maven-2,noclassdeffounderror,maven-dependency,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">
<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>
我使用mvn compile进行编译,并使用mvn包创建jar,这两种方法都没有任何错误地执行。但当我使用命令运行应用程序时
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
错误的原因是,当您打包它时,它不会创建一个fat/uberjar和一个存在FTPClient
的jar文件,而该文件不是myapp-1.0-SNAPSHOT.jar
的一部分,因此您会得到noclassfounderror
Maven Assembly Plugin帮助您创建一个fat jar(包括依赖项)jar并创建一个可运行的jar,您可以在其中给出Main
方法的FQCN。因此,当您运行胖jar时,它将具有所有依赖项,并且您的程序将运行良好
在pom.xml中包含以下插件并运行mvn包
命令
<!-- 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>
org.apache.maven.plugins
maven汇编插件
2.4.1
带有依赖项的jar
com.myapp.app.app
组装
包裹
单一的
注意:-这里用您的完全限定类名更改mainclass
如果它不起作用,请告诉我。我能够解决向
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>
org.apache.maven.plugins
maven jar插件
真的
依赖性/
com.example.MainClass
org.apache.maven.plugins
maven依赖插件
复制依赖项
包裹
复制依赖项
假的
在编译和运行项目之后,它运行得非常好
当我使用
mvn compile
时,它只是编译我的主类,但并没有合并依赖项。这就是为什么当我试图运行JAR文件时,它给出了错误ClassNotFound
,为此,您需要添加mvn插件复制依赖项
,并添加执行标记以执行mvn命令复制依赖项
,这意味着Maven没有为您的项目关闭该JAR,或者它没有正确打包。从后者开始。打包时是否有错误?您应该理解为什么要添加特定的代码,以及错误背后的原因。我在回答中解释了这一点,请尝试一下并让我知道。
<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>