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。