gpt4 book ai didi

java - 在cmd中运行基于gradle的Java应用程序时发生ClassNotFoundException

转载 作者:行者123 更新时间:2023-12-03 04:07:05 24 4
gpt4 key购买 nike

我有一个基于Simple Gradle的Java项目,在gradle build文件夹下创建了build/libs jar之后。当我尝试在以下路径中使用java -jar discord-notification-bot-1.0-SNAPSHOT.jar在cmd中运行时F:\github projects\discord-notification-bot\build\libs>我低于错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/javacord/api/DiscordApiBuilder
at Application.main(Application.java:8)
Caused by: java.lang.ClassNotFoundException: org.javacord.api.DiscordApiBuilder
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)
... 1 more
build.gradle
plugins {
id 'java'
}

group 'org.test'
version '1.0-SNAPSHOT'

repositories {
mavenCentral()
}

dependencies {
implementation 'org.javacord:javacord:3.0.6'
}

jar {
manifest {
attributes(
'Main-Class': 'Application'
)
}
}
在src / Application.java下
import org.javacord.api.DiscordApi;
import org.javacord.api.DiscordApiBuilder;

public class Application {
public static void main(String[] args) {
String key = System.getenv().get("key");
DiscordApi api = new DiscordApiBuilder().setToken(key).login().join();

System.out.println("you can invite the bot by using following url "+api.createBotInvite());
}
}

当我通过cmd运行时,似乎 javacord库没有得到体现。
注意:MANIFEST.MF中的我有正确的主应用程序。
但是通过cmd运行时依存关系没有得到体现。
那么,我该怎么办?

最佳答案

gradle java插件默认不会将类路径信息添加到生成的JAR中。您可以类似于添加主类的方式添加此信息,但最好使用gradle application plugin
使用application插件,您将获得一个存档文件作为输出,该文件将所有依赖项和一些bat / sh文件 bundle 在一起,以供执行。一个带有应用程序插件的简单gradle文件可能如下所示:

plugins {
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}

repositories {
// Use JCenter for resolving dependencies.
jcenter()
}

dependencies {
// This dependency is used by the application.
implementation 'com.google.guava:guava:29.0-jre'
}

application {
// Define the main class for the application.
mainClass = 'gradle.application.App'
}
如评论中所述,另一种解决方案可能是使用 com.github.johnrengelman.shadow plugin创建shadow / fat / uber-jar。这将产生以下基本gradle文件:
plugins {
id 'java'
// Apply the shadow plugin to add support for building a shadow-jar
id "com.github.johnrengelman.shadow" version "6.1.0"
}

repositories {
// Use JCenter for resolving dependencies.
jcenter()
}

dependencies {
// This dependency is used by the application.
implementation 'com.google.guava:guava:29.0-jre'
}

jar {
manifest {
attributes(
'Main-Class': 'Application'
)
}
}
使用影子插件,您将获得一个附加任务 shadowJar,它将创建一个包含所有依赖项的JAR。虽然听起来很方便,但它也有一些缺点,例如当使用shadow-jar作为依赖项本身时,可能会导致需要其他配置。但是,对于您而言,这可能是最佳选择。

关于java - 在cmd中运行基于gradle的Java应用程序时发生ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64680079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com