Maven верный не мог найти класс ForkedBooter
Недавно, приходя в новый проект, я пытаюсь скомпилировать наш исходный код. Вчера все работало нормально, а сегодня другая история.
Каждый раз, когда я запускаю mvn clean install
на модуле, при достижении тестов он выдает ошибку:
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ recorder ---
[INFO] Surefire report directory: /lhome/code/recorder/target/surefire-reports
[INFO] Using configured provider org.apache.maven.surefire.junitcore.JUnitCoreProvider
[INFO] parallel='none', perCoreThreadCount=true, threadCount=0, useUnlimitedThreads=false, threadCountSuites=0, threadCountClasses=0, threadCountMethods=0, parallelOptimized=true
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Error: Could not find or load main class org.apache.maven.surefire.booter.ForkedBooter
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
и позже:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project recorder: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test failed: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
Я использую 64-разрядную версию Debian 9 (Stretch) с OpenJDK 1.8.0_181, Maven 3.5.4, работаю за прокси-сервером моей компании, который я настроил в своем ~/.m2/settings.xml
.
Странно то, что последняя версия Surefire - 2.22.1, если я правильно помню. Я попытался указать версию плагина, но он не обновляется, иначе нет никакой спецификации версии плагина ни в одном POM (parent, grand-parent или этот).
Мне удалось заставить Maven изменить версию Surefire на последнюю, но теперь она стала еще хуже:
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[...]
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project recorder: There are test failures.
[ERROR]
[ERROR] Please refer to /lhome/code/recorder/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /lhome/code/recorder/ && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java '-javaagent:/lhome1/johndoe/.m2/repository/org/jacoco/org.jacoco.agent/0.7.4.201502262128/org.jacoco.agent-0.7.4.201502262128-runt ime.jar=destfile=/lhome/code/recorder/target/jacoco.exec,append=true,includes=esa/*,excludes=**/api/**/*.class' -jar /lhome/code/recorder/target/surefire/surefirebooter7426165516226884923.jar /lhome/code/recorder/target/surefire 2018-10-26T16-16-12_829-jvmRun1 surefire1721866559613511529tmp surefire_023400764142672144tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /lhome/code/recorder/ && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java '-javaagent:/lhome1/johndoe/.m2/repository/org/jacoco/org.jacoco.agent/0.7.4.201502262128/org.jacoco.agent-0.7.4.201502262128-runt ime.jar=destfile=/lhome/code/recorder/target/jacoco.exec,append=true,includes=esa/*,excludes=**/api/**/*.class' -jar /lhome/code/recorder/target/surefire/surefirebooter7426165516226884923.jar /lhome/code/recorder/target/surefire 2018-10-26T16-16-12_829-jvmRun1 surefire1721866559613511529tmp surefire_023400764142672144tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:669)
[ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
[ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
[ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
[ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
[ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
[ERROR] at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
[ERROR] at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
[ERROR] at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
[ERROR] at org.apache.maven.cli.MavenCli.execute(MavenCli.java:954)
[ERROR] at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
[ERROR] at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR] at java.lang.reflect.Method.invoke(Method.java:498)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Ответы
Ответ 1
Чтобы исправить это (в 2018 году), обновите ваш openjdk до последней версии, по крайней мере, 8u191-b12. В случае, если эта проблема появится снова в 2020 году, вполне вероятно, что поведение openjdk по умолчанию было изменено, и вам потребуется обновить плагин maven surefire.
Это была теперь исправленная ошибка в пакете openjdk-8 (поведение значительно отклоняется от апстрима без необходимости; отсутствует вышестоящий патч для возврата к отключению проверки безопасности), до которого вы только что обновились. Но это также ошибка в плагине surefire, SUREFIRE-1588, предположительно исправленная в surefire 3.0.0-M1: она, очевидно, использует абсолютные пути в месте, где Java в будущем будет разрешать только относительные имена путей (а Debian активировал будущее поведение уже).
Версия пакета 8u181-b13-2 гласит:
- Примените исправления из обновления безопасности 8u191-b12.
Обратите внимание, что 191-b12! = 181-b13. Исправления безопасности 191-b12 были выпущены всего несколько дней назад, и, очевидно, сопровождающие хотели их быстро достать. Полное обновление до 191-b12, вероятно, потребует дополнительного тестирования (ну, так что, очевидно, должен иметь эту загрузку).
Было несколько обходных путей:
- Вместо этого вы можете установить предыдущий пакет из snapshots.do. После понижения версии вы можете запретить испорченную версию (если вы используете aptitude, а не
apt
), используя sudo aptitude forbid-version openjdk-8-jre-headless
. Для обычного "apt" я не видел аналогичного механизма запрета, поэтому вам, вероятно, придется использовать apt-пиннинг, чтобы предотвратить переустановку этого обновления (или вы просто продолжаете понижать версию, надеюсь, это скоро будет решено). - В соответствии с отслеживанием ошибок, установка свойства
-Djdk.net.URLClassPath.disableClassPathURLCheck=true
с любым из обычных методов (например, JAVA_FLAGS
) также должна помочь. Но я не проверял это сам. Очевидно, вы даже можете добавить обходной путь в ~/.m2/settings.xml
чтобы включить его для всех ваших сборок Maven.
Как видите, отслеживание ошибок работает, проблема сузилась, и доступен фиксированный пакет, и скоро выйдет новая версия плагина surefire!
Ответ 2
Я нашел этот обходной путь и исправил свои тесты: настройте maven-surefire-plugin
чтобы он не использовал системный загрузчик классов.
Ответ 3
Установите для useSystemClassloader значение false:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
Если вы не наследуете от родителя, для которого определена версия (например, стартовая версия Spring Boot), вам также необходимо определить это.
Ответ 4
У меня есть другой обходной путь. Установите переменную среды _JAVA_OPTIONS. Я использовал это для наших агентов сборки TeamCity, и теперь наши сборки работают нормально.
_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true
Ответ 5
Я опубликовал более целенаправленный вариант одного из вышеуказанных обходных путей в JIRA. Добавьте в ~/.m2/settings.xml
:
<profile>
<id>SUREFIRE-1588</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
</properties>
</profile>
Ответ 6
У меня была эта проблема в моей сборке GitLab CI, которая использовала maven:3.5.4-jdk-8
образ Docker.
Изменив его на maven:3.5.4-jdk-8-alpine
проблему.
Ответ 7
Я перешел по этой ссылке https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html и добавил следующий плагин в pom.xml, и он работал,
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
Ответ 8
При использовании GitLab CI/CD с изображением 3.6.0-jdk-8
помогло только следующее свойство (без изменения pom.xml
).
-Dsurefire.useSystemClassLoader=false
Ответ 9
Для тех, кто ищет ответ, связанный с Docker Maven: 3.5.x-jdk-8 на GitLab CI, смотрите эту проблему GitHub.
Похоже, образ 3.5.4-jdk-8
привел к обновлению до минорной версии Java, что каким-то образом влияет на механизм разветвления Surefire.
Откат к 3.5.3-jdk-8
образ исправил это для меня на моем сервере GitLab CI, создавая код Java 1.8 с Surefire 2.20.1.
Ответ 10
Приведенное выше предложение установить свойство "-Djdk.net.URLClassPath.disableClassPathURLCheck = true" не сработало для меня, но установка следующего работает нормально:
-DforkCount=0
Ответ 11
Для Ubuntu: установите последнюю версию, эта ошибка исправлена
sudo apt-get update ; sudo apt-get dist-upgrade -y
Установите последнюю рабочую версию (без исправлений безопасности) без ошибок.
sudo apt-get install openjdk-8-jdk-headless=8u181-b13-1 openjdk-8-jdk=8u181-b13-1 openjdk-8-jre=8u181-b13-1 openjdk-8-jre-headless=8u181-b13-1 openjdk-8-source=8u181-b13-1
Если вы пропустили эту версию, используйте версию до этого:
sudo apt-get install openjdk-8-jdk-headless=8u162-b12-1 openjdk-8-jdk=8u162-b12-1 openjdk-8-jre=8u162-b12-1 openjdk-8-jre-headless=8u162-b12-1 openjdk-8-source=8u162-b12-1
Затем используйте закрепление или следите за тем, чтобы не установить неработающую версию.
Использование -Djdk.net.URLClassPath.disableClassPathURLCheck=true
не работает для меня, где бы я ни разместил эту конфигурацию. Где-то в моих интеграционных тестах он всегда выходил без старой версии Java.
Как упоминал Эрих, это ошибка в пакете Debian, которая слишком строга 911925, и плагин Surefire не работает в соответствии с новыми правилами SUREFIRE-1588.
Ответ 12
Я недавно настроил Maven Job на Jenkins и застрял в той же проблеме. Я принял предложение изменить переменную JAVA env и подтвердить, что проблема решена. Это как я проверял.
Станьте пользователем "jenkins" и измените папку на имя проекта рабочей области, которое вы настроили для работы.
$ _JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean install -U
$ lsb_release -rd
Description: Ubuntu 16.04.5 LTS
Release: 16.04
$ mvn -v
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.8.0_181, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-131-generic", arch: "amd64", family: "unix"
Ответ 13
Я удалил JDK, который входит в репозитории:
$ sudo apt purge openjdk-8-jdk
$ sudo apt autoremove
Затем я удалил переменную среды JAVA_HOME
. Мой был установлен в моем.bashrc.
Затем я переустановил его через SDKMAN:
$ sdk install java 8.0.181-zulu
С их сайта:
SDKMAN! это инструмент для управления параллельными версиями нескольких комплектов разработки программного обеспечения в большинстве систем на основе Unix. Он предоставляет удобный интерфейс командной строки (CLI) и API для установки, переключения, удаления и вывода списка кандидатов.
Чтобы увидеть другие версии JDK для установки, используйте:
$ sdk list java
Ответ 14
Я столкнулся с той же проблемой с gitlab ci, меняя образ maven с maven:3-jdk-8
на maven:3.6.0-jdk-8-alpine
. Кстати, я также тестировал с maven:3.6.0-jdk-8
но он тоже не работал.
Ответ 15
Я добавил зависимость к junit-jupiter-engine, и это сработало.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
</dependency>
</dependencies>
</plugin>
Ответ 16
Если, как и я, у вас есть проблемы в вашем конвейере (для меня это в GitLab, но неважно) и если вы используете образ Maven JDK 8 Docker.
Вы можете заменить
image: maven:3.5.4-jdk-8
последней рабочей сборкой
image: [email protected]:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b
Ответ 17
Я использую это как обходной путь для остановки компиляции и выполнения тестовых файлов:
-Dmaven.test.skip=true with maven