netbeans 线程“main”中出现异常java.lang.NoClassDefFoundError:可能与Maven有关

jdgnovmf  于 2022-11-10  发布在  Java
关注(0)|答案(2)|浏览(163)

我有2个java文件:

package com.pokebot;

import javax.security.auth.login.LoginException;
import net.dv8tion.jda.core.AccountType;
import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.JDABuilder;
import net.dv8tion.jda.core.exceptions.RateLimitedException;

public class App {

    public static void main(String[] args)
    {
        try {
            JDA jdaBot = new JDABuilder(AccountType.BOT).setToken("my_token").buildBlocking();
            jdaBot.addEventListener(new Pokebot());
        } catch (LoginException e) {
    //            System.out.println("LoginException");
        } catch (InterruptedException e) {
    //            System.out.println("InterruptedException");
        } catch (RateLimitedException e) {
    //            System.out.println("RateLimitedException");
        }
    }

}

以及:

package com.pokebot;

import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.entities.MessageChannel;
import net.dv8tion.jda.core.entities.User;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import net.dv8tion.jda.core.hooks.ListenerAdapter;

public class Pokebot extends ListenerAdapter {

    @Override
    public void onMessageReceived(MessageReceivedEvent e) {

        //Obtains properties of the received message
        Message objMsg = e.getMessage();
        MessageChannel objChannel = e.getChannel();
        User objUser = e.getAuthor();

        //Responds to any user who says "hello"
        if (objMsg.getContent().equals("hello")) {
            objChannel.sendMessage("Hello, " + objUser.getAsMention() +"!").queue();
        }

    }
}

当我从Netbeans运行应用程序(主类是App from 1st file)时,我只收到一条通知:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

但应用程序仍然工作。当我尝试从命令行运行它时:

java -jar target/pokebotapp-1.0-SNAPSHOT.jar

然后我会得到一个如下所示异常:
Exception in thread "main" java.lang.NoClassDefFoundError: net/dv8tion/jda/core/exceptions/RateLimitedException

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: net/dv8tion/jda/core/
exceptions/RateLimitedException
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: net.dv8tion.jda.core.exceptions.Rat
eLimitedException
        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)
        ... 7 more

而且应用程序甚至没有启动。
我在这个项目中使用了Maven。

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.pokebot</groupId>
    <artifactId>pokebotapp</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <!--<classpathPrefix>lib/</classpathPrefix>-->
                            <mainClass>com.pokebot.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.5.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>
                                ${project.build.directory}/dependency-jars/
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>net.dv8tion</groupId>
            <artifactId>JDA</artifactId>
            <version>3.3.1_291</version>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>jcenter</id>
            <name>jcenter-bintray</name>
            <url>http://jcenter.bintray.com</url>
        </repository>
    </repositories>
    </project>

在我尝试从控制台运行项目之前,我运行了maven compile。我想这可能是我运行程序的方式的错误,或者是我为这个项目设置maven的方式的错误。有人知道问题出在哪里吗?

rdlzhqv9

rdlzhqv91#

这是因为java不知道从哪里获取这些库。
1.构建包含所有依赖项的jar(所谓的uber-jar)。这是通过maven shade插件完成的。文档可在此处获得:https://maven.apache.org/components/plugins/maven-shade-plugin/examples/executable-jar.html

  1. java -jar -cp文档如下所示:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
    第一个选项肯定更好:)我想应该有很多关于stackoverflow如何配置maven-shade-plugin的例子。What is the maven-shade-plugin used for, and why would you want to relocate java packages?
fiei3ece

fiei3ece2#

With gradle

This can be fixed by using the shadow plugin and building your jar with shadowJar instead. The jar will then be present in the build/libs directory with a name like example-1.0-all.jar

With Maven

You need the shade plugin in your pom to add dependencies to your package task. You can see the shade plugin being applied in this example pom.xml

From https://jda.wiki/using-jda/troubleshooting/

相关问题