okhttp NoClassDefFoundError при запуске проекта - PullRequest
0 голосов
/ 26 января 2019

Я создал файл build.gradle, который выглядит следующим образом:

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.squareup.okhttp3:okhttp:3.12.1'
}

тогда у меня есть простой класс helloWorld, который использует пример кода с сайта okhttp:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class helloWorld{
    public static void main(String[] args){
        System.out.println("Hello World!");
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
        .url("www.google.com")
        .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println("SUCCESSS---->"+response.body().string());
        } catch (IOException e){
            System.out.println("......error thrown");
        }
    }
}

Когда я пытаюсь запустить скомпилированный файл класса, я получаю следующую ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: okhttp3/OkHttpClient at helloWorld.main(helloWorld.java:6)
Caused by: java.lang.ClassNotFoundException: okhttp3.OkHttpClient at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader. 
ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 1 more

Если я уберу строки

OkHttpClient client = new OkHttpClient(); 
Request request = new Request.Builder()
    .url("www.google.com")
    .build();

    try (Response response = client.newCall(request).execute()) {
        System.out.println("SUCCESSS---->"+response.body().string());
    } catch (IOException e){
        System.out.println("......error thrown");
    }

тогда класс работает правильно. Поэтому я думаю, что, возможно, банка импортируется неправильно?

Для ясности, проект компилируется правильно, проблема возникает, только если я пытаюсь запустить скомпилированный файл класса.

1 Ответ

0 голосов
/ 26 января 2019

Gradle не включает зависимости при создании jar по умолчанию.

Вы можете использовать тень, чтобы создать банку со всеми зависимостями https://github.com/johnrengelman/shadow как это:

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '4.0.4' . <----- add shadow dependency
}

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.squareup.okhttp3:okhttp:3.12.1'
}

при сборке shadow добавит другой файл с именем {your_project} -shadow.jar в каталог сборки или что-то подобное. Выполните это, и вы должны увидеть его выполнение.

...