Вот как выглядит мой файл 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
Что я пробовал до сих пор:
runtime files('src/test/java/utils')
в раздел dependencies
моего build.gradle.compile files('src/test/java/utils')
в раздел dependencies
моего build.gradle.dependencies
моего build.gradle.Обновлено: После некоторых проб и ошибок кажется, что причиной здесь является версия Java, поскольку проблема наблюдается с Java 11, а не с Java 8. Я проверил это поведение на нескольких машинах, чтобы убедиться, что на моей машине нет ничего конкретного.
Обновлено. На самом деле, он не показывает много деталей в консоли CI.
«Корень» ваших файлов кода, т.е. тестовых файлов, в этом случае должен быть src/test/java
. Итак, вы можете попробовать добавить переменную compile files('src/test/java') to your
testClasspath`.
Кажется, это не помогает.
Вы не указали, какой именно класс не найден! Полный стек поможет.
Тем не менее, как вы упомянули, он работал на jdk8, что означает высокую вероятность того, что вы используете/зависите от некоторого класса, который удаляется после jdk9, например jaxb, javax и т. д.
Если это так, у вас есть несколько вариантов здесь:
jvmopts
или создайте файл --add-modules=java.xml.bind,java.activation
с приведенной выше строкой в корневом каталоге вашего проекта.Виноват! Я не добавил полную трассировку в вопрос, который я сделал сейчас. Похоже, проблема связана с библиотекой с поддержкой REST. Изучаем это дальше.
После просмотра полной трассировки ошибки кажется, что ошибка возникает из кода библиотеки с поддержкой REST. И обновление зависимости io.rest-assured
с 3.0.0 до 4.0.0 помогло решить эту проблему.
Да, я сделаю это, через 4 часа. :)
вы можете попробовать изменить версию уверенной зависимости. с 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 или новее для своего проекта. Итак, чтобы исправить эту ошибку, вам нужно:
<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
Пожалуйста, опубликуйте полное сообщение об ошибке. это может помочь кому-то изолировать проблему.