我有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的方式的错误。有人知道问题出在哪里吗?
2条答案
按热度按时间rdlzhqv91#
这是因为java不知道从哪里获取这些库。
1.构建包含所有依赖项的jar(所谓的uber-jar)。这是通过maven shade插件完成的。文档可在此处获得:https://maven.apache.org/components/plugins/maven-shade-plugin/examples/executable-jar.html
第一个选项肯定更好:)我想应该有很多关于stackoverflow如何配置maven-shade-plugin的例子。What is the maven-shade-plugin used for, and why would you want to relocate java packages?
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/