java - Gradle for Java 项目中的 ClassNotFound 错误
问题描述
我是 Gradle 的新手,正在尝试构建一个简单应用程序的 JAR。这是我的主文件:
package com.bo.getserversecrets;
import org.json.JSONObject;
import org.json.JSONException;
public class GetServerSecrets {
public static void main(String[] args) {
getServerSecrets();
}
public static void getServerSecrets() {
JSONObject jsonObject = new JSONObject("JSON String");
}
}
我正在尝试使用 AWS SDK,但即使在这方面也遇到了问题。这是我的build.gradle
:
plugins {
id 'java'
}
group 'com.bo'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
implementation 'org.json:json:20180813'
}
jar {
manifest {
attributes 'Main-Class': 'com.bo.getserversecrets.GetServerSecrets'
}
}
在我的 Gradle 运行配置中,我有构建 jar。构建成功并生成 JAR 文件。但是,当我使用 JAR ( java -jar
) 运行时,我收到此错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
at com.bo.getserversecrets.GetServerSecrets.getServerSecrets(GetServerSecrets.java:34)
at com.bo.getserversecrets.GetServerSecrets.main(GetServerSecrets.java:20)
Caused by: java.lang.ClassNotFoundException: org.json.JSONObject
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)
任何尝试的建议都非常感谢。谢谢你。
解决方案
像往常一样,NoClassDefFoundError: org/json/JSONObject
意味着你的 Java 代码使用org.json.JSONObject
类编译;但该类在运行时不存在。(并且由于缺少该类,因此可能缺少整个罐子)。
org.json:json:20180813
当您运行 Java 应用程序时,您需要确保依赖项存在于类路径中。
有很多方法可以做到这一点,要么收集所有依赖项并将它们放在一个lib
文件夹中;或者你可以创建一个 uber-jar。
创建一个超级jar
例如,您可以使用 gradle-shadow 插件创建一个 uber-jar(请参阅github-gradle-shadow)。
请参阅下面更新的构建脚本;它构建gradle clean shadowJar
并运行java -jar build/libs/com.bo-1.0-SNAPSHOT-all.jar
plugins {
id 'java'
id 'com.github.johnrengelman.shadow' version '5.0.0'
}
group 'com.bo'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
implementation 'org.json:json:20180813'
}
shadowJar {
baseName = project.group
version = project.version
manifest {
attributes 'Main-Class': 'com.bo.getserversecrets.GetServerSecrets'
}
}
推荐阅读
- java - 创建 GoogleApiClient 时出错
- excel - 动态图表 VBA 的范围为空
- javascript - react-router-dom 给了我 404
- php - 对嵌套数组中的数据进行计数和求和
- kotlin - 如何理解这段 Kotlin 代码?
- docker - 将 Ubuntu Docker 容器作为 Marathon 应用程序运行不断重启
- c# - C#/XAML DataGridView 过滤
- php - 在本地机器上从 Amazon S3 下载文件,而不让用户知道 codeigniter PHP 中的文件来源
- c# - CopyFromScreen - 检查句柄是否有效
- python - 具有 phash 汉明距离的 Elasticsearch 聚合