Java.lang.NoClassDefFoundError с поддержкой REST 3.0.0 и Java 11 (не наблюдается в Java 8)

Вот как выглядит мой файл build.gradle:

plugins {
    id 'java'
    id "com.github.lkishalmi.gatling" version "0.7.0"
    id 'application'
}

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'io.rest-assured', name: 'rest-assured', version: '3.0.0'
}

task runTests(type: Test) {
    useTestNG() {
        useDefaultListeners = true
        suites 'src/test/testng.xml'
    }
}

Вот как выглядит мой testng.xml:

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name = "my-test-suite">
    <test name = "myTest">
        <classes>
            <class name = "tests.SomeTests">
                <methods>
                    <include name = "testVerifySomething"/>
                </methods>
            </class>
        </classes>
    </test>
</suite>

Ошибка java.lang.NoClassDefFoundError исходит от класса SomeTests в строке, где есть вызов статического метода из другого класса SomeUtils из другого пакета utils.

Вот полный след:

java.lang.NoClassDefFoundError: javax.xml.bind.JAXBException
    at io.restassured.config.ObjectMapperConfig.<init>(ObjectMapperConfig.java:49)
    at io.restassured.config.RestAssuredConfig.<init>(RestAssuredConfig.java:41)
    at io.restassured.RestAssured.<clinit>(RestAssured.java:420)
    at utils.SomeUtils.createUser(SomeUtils.java:13)
    at tests.SomeTests.createUser(SomeTests.java:63)
    at tests.SomeTests.testCreateUsers(SomeTests.java:47)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
    at org.testng.TestNG.runSuites(TestNG.java:1049)
    at org.testng.TestNG.run(TestNG.java:1017)
    at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.runTests(TestNGTestClassProcessor.java:139)
    at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.stop(TestNGTestClassProcessor.java:89)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy2.stop(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:131)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.base/java.lang.Thread.run(Thread.java:825)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:768)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:1052)
    ... 56 more

Структура каталогов выглядит следующим образом:

build.gradle
src
--test
----java
------tests
        SomeTests
------utils
        SomeUtils

Что я пробовал до сих пор:

  1. Добавьте runtime files('src/test/java/utils') в раздел dependencies моего build.gradle.
  2. Добавьте compile files('src/test/java/utils') в раздел dependencies моего build.gradle.
  3. Добавьте 1 и 2 в раздел dependencies моего build.gradle.

Обновлено: После некоторых проб и ошибок кажется, что причиной здесь является версия Java, поскольку проблема наблюдается с Java 11, а не с Java 8. Я проверил это поведение на нескольких машинах, чтобы убедиться, что на моей машине нет ничего конкретного.

Пожалуйста, опубликуйте полное сообщение об ошибке. это может помочь кому-то изолировать проблему.

Anjana 22.07.2019 12:48

Обновлено. На самом деле, он не показывает много деталей в консоли CI.

Akshay Maldhure 22.07.2019 12:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
2 615
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

«Корень» ваших файлов кода, т.е. тестовых файлов, в этом случае должен быть src/test/java. Итак, вы можете попробовать добавить переменную compile files('src/test/java') to yourtestClasspath`.

Кажется, это не помогает.

Akshay Maldhure 23.07.2019 12:02

Вы не указали, какой именно класс не найден! Полный стек поможет.

Тем не менее, как вы упомянули, он работал на jdk8, что означает высокую вероятность того, что вы используете/зависите от некоторого класса, который удаляется после jdk9, например jaxb, javax и т. д.

Если это так, у вас есть несколько вариантов здесь:

  • запустите приложение/тест со следующей настройкой jvmopts или создайте файл --add-modules=java.xml.bind,java.activation с приведенной выше строкой в ​​корневом каталоге вашего проекта.
  • добавить явную зависимость в вашей сборке на основе того, какой класс отсутствует

Виноват! Я не добавил полную трассировку в вопрос, который я сделал сейчас. Похоже, проблема связана с библиотекой с поддержкой REST. Изучаем это дальше.

Akshay Maldhure 24.07.2019 07:14
Ответ принят как подходящий

После просмотра полной трассировки ошибки кажется, что ошибка возникает из кода библиотеки с поддержкой REST. И обновление зависимости io.rest-assured с 3.0.0 до 4.0.0 помогло решить эту проблему.

Да, я сделаю это, через 4 часа. :)

Akshay Maldhure 24.07.2019 07:57

вы можете попробовать изменить версию уверенной зависимости. с 3.0.0 до 4.1.2

<dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>4.1.2</version>
</dependency>

это поможет

Это связано с тем, что в пути к классам отсутствует библиотека JAXB (архитектура Java для привязки XML). JAXB включен в Java SE 10 или более ранней версии, но удален из Java SE из Java 11 или более поздней версии — перемещен в Java EE в рамках проекта Jakarta EE. Это означает, что если вы столкнулись с ошибкой JAXBException, очень вероятно, что вы используете Java 11 или новее для своего проекта. Итак, чтобы исправить эту ошибку, вам нужно:

  1. Используйте более старые версии Java, такие как JDK 8, 9 или 10, которые по умолчанию включают библиотеку JAXB. Или:
  2. Укажите дополнительную зависимость в файле pom.xml вашего проекта следующим образом:
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>

Если вы не используете Maven https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api/2.3.0

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