java - Gradle for Java 项目中的 ClassNotFound 错误

标签 java gradle intellij-idea

我是 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 类编译的;但是该类在运行时不存在。 (并且由于类丢失,整个 jar 可能丢失)。

当您运行 Java 应用程序时,您需要确保类路径中存在 org.json:json:20180813 依赖项。

有很多方法可以做到这一点,要么收集所有依赖项并将它们放在 lib 文件夹中;要么或者您可以创建一个 uber-jar。


创建一个 uber-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 - Gradle for Java 项目中的 ClassNotFound 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56453845/

相关文章:

java - 从android中的webview获取可见文本

java - 我正在使用gradle但我将错误作为构建失败

android - 可能有一个 Jenkins 构建失败测试,​​但不会使整个构建失败?

android - 不会为从 Android Gradle 插件 8.0 发布的 Maven 自动创建软件组件

intellij-idea - intellij hybris 类重新编译不起作用

android-studio - 完整的包名称而不是 Android Studio 中的文件夹

java - spinner.setAdapter(适配器) 导致 "A resource was acquired at attached stack trace but never released"错误并应用程序强制关闭

java - Java 缺少无符号原始类型是 Java 平台的特征还是 Java 语言的特征?

intellij-idea - 为什么在 IntelliJ 中为 "Smart cast to kotlin.String"

java - Java 6 中对 ISO 8601 格式的一般支持