Gradle for Java项目中的ClassNotFound错误

时间:2019-06-05 03:15:33

标签: 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开发工具包,但即使这样也有问题。 这是我的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)

任何尝试的建议都非常感谢。 谢谢。

1 个答案:

答案 0 :(得分:1)

与往常一样,NoClassDefFoundError: org/json/JSONObject表示您的Java代码是使用org.json.JSONObject类编译的;但是该类在运行时不存在。 (并且由于缺少该类,因此可能缺少整个jar)。

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

有很多方法可以做到这一点,要么收集所有依赖项,然后将它们放在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'
    }
}