【问题标题】:JAR File built not right [duplicate]JAR 文件构建不正确[重复]
【发布时间】:2020-05-06 09:36:01
【问题描述】:

我有一个 Discord Bot(在 Java 中),如果我直接在 IntelliJ (Maven) 中运行该机器人,一切都很好 但是,如果我想在 JAR 中构建 Bot,我会收到此错误:

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 默认不包含依赖项 - 您需要提供自定义构建步骤以根据您的需要包含依赖项。自从我使用 maven 已经有一段时间了,但 something like this 可能会导致解决方案
  • 您可以查看我的回答here。它引用了另一个依赖,但步骤是一样的。

标签: java maven jar


【解决方案1】:

默认情况下,Maven 不会将您的依赖项及其传递依赖项打包到构建工件中。这不会导致编译时出现任何问题,因为依赖类位于 IDE 的 libs 类路径中。但是在运行时,这可能会引发ClassNotFoundException 异常,因为这些类不在运行时类路径中。您必须指示 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>

确保按照上述方式定义主类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多