classNotFound ошибка по Maven?

Я учусь 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 compile и создал 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

2 ответа

Причина, почему это дает noclassfound ошибка в том, что, когда вы упаковываете его, он не создает JAR- файл FAT / Uber и файл, в котором FTPClient присутствует, это не является частью вашего myapp-1.0-SNAPSHOT.jar следовательно, вы получите noclassfounderror.

Плагин Maven Assembly поможет вам создать банку с толстыми банками (включая зависимости) и создаст исполняемую банку, где вы дадите свой FQCN: Main метод. Следовательно, когда вы запустите толстую флягу, у нее будут все зависимости, и ваша программа будет работать нормально.

Включите плагин ниже в ваш 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>

Примечание:- здесь измените основной класс с полным именем вашего класса.

Дайте мне знать, если это не сработает.

Я могу решить проблему с добавлением кода в 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 он просто компилирует мой основной класс, но не объединяет зависимости. Вот почему, когда я пытаюсь запустить файл JAR, он выдает ошибку ClassNotFound, для этого нужно добавить mvn plugin copy-dependencies и добавьте тег выполнения для выполнения команды mvn copy-dependencies

Другие вопросы по тегам