Ошибка ClassNotFound в проекте Gradle для Java - PullRequest
2 голосов
/ 05 июня 2019

Я новичок в 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 Run у меня есть сборка 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 Ответ

1 голос
/ 05 июня 2019

Как обычно, NoClassDefFoundError: org/json/JSONObject означает, что ваш код Java скомпилирован с использованием класса org.json.JSONObject;но этот класс не присутствует во время выполнения.(и поскольку класс отсутствует, вероятно, отсутствует весь jar-файл).

При запуске приложения Java необходимо убедиться, что в пути к классам присутствует зависимость org.json:json:20180813.

Есть много способов сделать это, либо вы собираете все зависимости и помещаете их в папку lib;или вы можете создать uber-jar.


Создание uber-jar

Например, вы можете создать uber-jar, используя gradle-shadowплагин (см. 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'
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...