JAR 文件构建不正确
JAR File built not right
我有一个 Discord Bot(在 Java 中),如果我直接在 IntelliJ (Maven) 中 运行 机器人,一切都很好
但是如果我想在 JAR 中构建机器人,我会收到此错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/mongodb/MongoClient
at de.therealjan.TheRealBot.MongoDB.<init>(MongoDB.java:14)
at de.therealjan.TheRealBot.TheRealBot.main(TheRealBot.java:16)
Caused by: java.lang.ClassNotFoundException: com.mongodb.MongoClient
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
MongoDB.java:
package de.therealjan.TheRealBot;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import java.net.UnknownHostException;
public class MongoDB {
public MongoClient mongoClient;
public DB db;
public MongoDB() {
try {
mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost:27017"));
} catch (UnknownHostException e) {
e.printStackTrace();
}
db = mongoClient.getDB("TheRealBot-JDA");
}
}
我认为 Maven 没有正确构建它,但我不知道。 (我运行包Maven Build)
默认情况下,Maven 不会将您的依赖项及其传递依赖项打包到构建工件中。这不会在编译时引起任何问题,因为相关 classes 位于 IDE 的库 class 路径中。但在运行时,这可能会引发 ClassNotFoundException
异常,因为那些 classes 不在运行时 class 路径中。你必须指示 maven 将它们打包到你的 jar 中。
将此插件添加到您的 Maven pom.xml
文件中。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>YOUR_MAIN_CLASS_FQN_GOES_HERE</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
确保您按照上述定义了主 class。
我有一个 Discord Bot(在 Java 中),如果我直接在 IntelliJ (Maven) 中 运行 机器人,一切都很好 但是如果我想在 JAR 中构建机器人,我会收到此错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/mongodb/MongoClient
at de.therealjan.TheRealBot.MongoDB.<init>(MongoDB.java:14)
at de.therealjan.TheRealBot.TheRealBot.main(TheRealBot.java:16)
Caused by: java.lang.ClassNotFoundException: com.mongodb.MongoClient
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
MongoDB.java:
package de.therealjan.TheRealBot;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import java.net.UnknownHostException;
public class MongoDB {
public MongoClient mongoClient;
public DB db;
public MongoDB() {
try {
mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost:27017"));
} catch (UnknownHostException e) {
e.printStackTrace();
}
db = mongoClient.getDB("TheRealBot-JDA");
}
}
我认为 Maven 没有正确构建它,但我不知道。 (我运行包Maven Build)
默认情况下,Maven 不会将您的依赖项及其传递依赖项打包到构建工件中。这不会在编译时引起任何问题,因为相关 classes 位于 IDE 的库 class 路径中。但在运行时,这可能会引发 ClassNotFoundException
异常,因为那些 classes 不在运行时 class 路径中。你必须指示 maven 将它们打包到你的 jar 中。
将此插件添加到您的 Maven pom.xml
文件中。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>YOUR_MAIN_CLASS_FQN_GOES_HERE</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
确保您按照上述定义了主 class。