NoClassDefFoundError: перехватчик квадратного журнала v3.12.0

Проблема

После добавления Библиотека Square Okhttp Logging Interceptor в мое приложение Kotlin я испытываю следующую ошибку, которая, как я думаю, может быть связана с конфликтом зависимостей Guava. У меня также есть подал вопрос в библиотеке Square.

Ошибка

Exception in thread "Timer-0" java.lang.NoClassDefFoundError: okhttp3/logging/HttpLoggingInterceptor
    at utils.Retrofit.retrofitBuilder(Retrofit.kt:28)
    at utils.Retrofit.<clinit>(Retrofit.kt:19)
    at content.ContentRequestsKt.getEventRegistryContent(ContentRequests.kt:40)
    at content.Task.retrieveAndSaveContent(ContentTasks.kt:146)
    at content.Task.run(ContentTasks.kt:57)
    at java.base/java.util.TimerThread.mainLoop(Timer.java:556)
    at java.base/java.util.TimerThread.run(Timer.java:506)
Caused by: java.lang.ClassNotFoundException: okhttp3.logging.HttpLoggingInterceptor
    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)
... 7 more

Настраивать

build.gradle (сканирование зависимостей)

buildscript {
    ext.kotlin_version = '1.3.11'
    ext.junitJupiterVersion  = '5.3.2'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.3'
    }
}

plugins {
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.2.51'
}

version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testImplementation group: 'junit', name: 'junit', version: '5.3.2'
    // JUnit Jupiter API and TestEngine implementation
    testImplementation("org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}")
    testRuntime("org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}")
    testImplementation "org.assertj:assertj-core:3.11.1"
    // To avoid compiler warnings about @API annotations in JUnit code
    testCompileOnly 'org.apiguardian:apiguardian-api:1.0.0'
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.5.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.4'
    implementation 'com.google.firebase:firebase-admin:6.6.0'
    implementation 'com.google.apis:google-api-services-youtube:v3-rev206-1.25.0'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

Retrofit.kt

package utils

import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import okhttp3.logging.HttpLoggingInterceptor.Level
import retrofit2.Retrofit
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import utils.Enums.EnvironmentType.PRODUCTION
import utils.EnvironmentType.environmentType

object Retrofit {

    val eventRegistryRetrofit: Retrofit
    val youTubeRetrofit: Retrofit

    init {
        eventRegistryRetrofit = retrofitBuilder(EVENTREGISTRY_BASE_URL)
        youTubeRetrofit = retrofitBuilder(YOUTUBE_BASE_URL)
    }

    /**
     * Build Retrofit object based on source.
     */
    fun retrofitBuilder(baseUrl: String): Retrofit {
        val debugOkHttpClient =
            okhttp3.OkHttpClient.Builder().addInterceptor(HttpLoggingInterceptor().setLevel(Level.BASIC)).build()
    return Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())
            .baseUrl(baseUrl)
            .client(if (environmentType == PRODUCTION) OkHttpClient() else debugOkHttpClient)
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build()
    }
}

Попытки решения

  1. Восстановление артефакта Jar.
  2. Реконструкция проекта.
  3. Аннулирование кеша IntelliJ и перезапуск IDE.
  4. Повторная синхронизация файла Gradle.
  5. Явно определите библиотеки гуава и com.google.api.
  6. Исключение старых версий гуава из библиотек. (сканирование зависимостей)

build.gradle

...
dependencies {
    implementation "com.google.guava:guava:27.0.1-jre"
    implementation ("com.google.api:gax:1.33.1") {
        exclude group: "com.google.guava", module: "guava"
    } 
    implementation ("com.google.api:gax-grpc:1.33.1") {
        exclude group: "com.google.guava", module: "guava"
    }
    ...
    implementation ('com.squareup.okhttp3:logging-interceptor:3.12.0') {
        exclude group: "com.google.guava", module: "guava"
    }
    ...
}
...

Как у вас работает эта программа?

Jesse Wilson 08.12.2018 04:46

Он запускается в среде IDE (IntelliJ) для разработки и тестирования. Для производства он встроен в файл Банка.

Adam Hurwitz 08.12.2018 19:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
1 085
2

Ответы 2

В моем случае было то, что я установил каротаж-перехватчик (3.13.1)

    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>logging-interceptor</artifactId>
        <version>3.13.1</version>
    </dependency>

Который использует okhttp (3.13.1)

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.13.1</version>
</dependency>

И мой Модернизация (2.5.0)

<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>retrofit</artifactId>
    <version>2.5.0</version>
</dependency>

Что использует okhttp (3.12.0)

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.12.0</version>
</dependency>

Из-за порядка (или чего-то еще) зависимость okhttp от каротажный перехватчик была опущена. Думаю, okhttp (3.12.0) несовместим с каротаж-перехватчик (3.13.1).

Я обнаружил ту же проблему, просто добавление перехватчика журналов в gradle приведет к сбою приложения.

Я пробовал разные версии: 3.13.1 и 3.14.2, но на данный момент, похоже, только 4.0.0-alpha2 решает проблему:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.0.0-alpha02'

Спасибо! Если эта проблема возникнет снова, я протестирую это решение. Проголосуйте за вопрос, чтобы другие люди, столкнувшиеся с этой проблемой, могли легко найти ваше решение.

Adam Hurwitz 05.06.2019 20:23

Другие вопросы по теме