Maven surefire не вдалося знайти клас ForkedBooter


218

Нещодавно прийшов до нового проекту, я намагаюся скласти наш вихідний код. Вчора все добре працювало, але сьогодні - інша історія.

Кожен раз, коли я працюю 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 - це 22.12.1, якщо я правильно пам'ятаю. Я спробував вказати версію плагіна, але вона не оновлюється, інакше специфікація версії плагіна не існує в жодному POM (батьківському, прабатьківському або цьому).

Мені вдалося змусити 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
У мене ця помилка в clircle-ci. Surefire forks та forked vm друкує таке повідомлення та виходить: "Помилка: не вдалося знайти або завантажити основний клас org.apache.maven.surefire.booter.ForkedBooter". Масаж проводиться в цільовому / surefire-доповіді / *. Dumpstream. Якщо ви запускаєте maven з -X, він друкує командний рядок, ви можете спробувати його і побачити vm, що друкує це повідомлення.
Бруно Кутіньо,


моє рішення було припинити використання open-jdks будь-якої версії. не можуть дозволити собі подібну ненадійність у чомусь такому фундаментальному.
Адріан М.

Використовуйте dependencyManagementрозділ maven, щоб вказати різні версії плагінів
jogaco

Оновлення до jdk 11 на Debian було надійним рішенням для мене!
clearlight

Відповіді:


251

Щоб виправити це (у 2018 році), оновіть свій openjdk до останньої версії, принаймні 8u191-b12. Якщо ця проблема з’явиться знову у 2020 році, цілком ймовірно, що поведінка openjdk за замовчуванням була змінена, і вам потім потрібно буде оновити плагін maven surefire.

Це була тепер виправлена помилка в пакеті openjdk-8 (поведінка значно відхиляється від висхідного потоку без необхідності; відсутній патч висхідного потоку для повернення назад до відключення перевірки безпеки), до якого ви тільки що оновили. Але це також помилка в безпомилковому плагін, SUREFIRE-1588 , імовірно , зафіксовані в SUREFIRE 3.0.0-M1 : він , по- видимому використовує абсолютні шляхи в місці , де Java буде в майбутньому тільки дозволить імена відносного шляху (і Debian активізовані майбутня поведінка вже).

Версія пакета 8u181-b13-2 зазначає:

  • Застосовуйте виправлення з оновлення безпеки 8u191-b12.

Зауважимо, що 191-b12! = 181-b13. Патчі безпеки 191-b12 були лише кілька днів тому, і, мабуть, технічні працівники хотіли отримати їх швидко. Повне оновлення до 191-b12, ймовірно, потребуватиме додаткового тестування (ну, мабуть, має бути завантаження цього, мабуть).

Було декілька рішень:

  1. Ви можете замість цього встановити попередній пакет із snapshots.do . Після пониження версії ви можете заборонити непрацюючу версію (якщо ви використовуєте придатність і ні apt) використовувати sudo aptitude forbid-version openjdk-8-jre-headless. Для звичайного "apt" я не бачив подібного механізму заборони, тому вам, ймовірно, доведеться використовувати придатне закріплення, щоб запобігти перевстановленню цього оновлення (або ви просто продовжуватимуть поновлювати процес знову, я сподіваюся, що це скоро буде вирішено).
  2. Відповідно до відстеження помилок, також може допомогти встановлення властивості -Djdk.net.URLClassPath.disableClassPathURLCheck=trueбудь-яким із звичайних методів (наприклад, JAVA_FLAGS). Але я сам цього не перевірив. Ви, мабуть, навіть можете додати рішення, щоб~/.m2/settings.xml зробити його увімкненим для всіх ваших побудов Maven.

Як бачите, функція відстеження помилок працює , проблему звузили, і доступний фіксований пакет, і незабаром з’явиться нова версія плагіна-версії!


@AdrianMadaras Я не отримав нове оновлення поки що, лише версія -2. Також не було анонсованого фіксованого завантаження, але його триває. Ви, ймовірно, просто переробили до відомої проблемної версії.
Еріх Шуберт

1
Я щойно отримав ту саму проблему на Ubuntu 18.04, використовуючи OpenJDK 10.0.2. Перемикання JAVA_HOME на мою установку 'java-9-oracle' виправлено.
RobAu

2
Ось відповідна проблема у трекері випуску surefire -maven-plugin: issues.apache.org/jira/browse/SUREFIRE-1588 (це все-таки помилка в резервній частині Canonical / Debian відповідних змін OpenJDK).
mirabilos

1
Робота навколо 1. не має сенсу для мене, оскільки це версія, з якою я відчуваю проблему. Перевірити плагін maven-surefire на не використовуватиSystemClassLoader також не вийшло
Едвін Діаз-Мендес

1
Ви також можете спробувати оновити версію 3.0.0-M1. Але 2 до 3 віхової версії, звичайно, можуть порушити інші речі.
Еріх Шуберт

54

Встановіть useSystemClassloader на значення false:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
</plugin>

Якщо ви не успадковуєте від батьків, у яких визначена версія для вас (наприклад, Spring Boot Starter), вам також потрібно визначити це.


Увімкнення завантажувача системного класу - це найгірша практика, оскільки ви виконуєте тести в плагіні. Правильна практика - оновити версію кожного плагіна. Maven 3.7.0 оновить версії всіх плагінів, які належать до життєвого циклу за замовчуванням. Весна не повинна дотримуватися старих версій і не повинна їх перекривати. Це спричиняє зайві конфлікти у відповідальності.
tibor17

52

Я знайшов це рішення і виправив свої тести: налаштувати maven-surefire-pluginне використовувати системний завантажувач.


За твердженням Maven-surefire-плагінів, всі обхідні шляхи (це встановлення forkCountна 0 або встановлення в argLineусьому світі) мають проблеми і не можуть застосовуватися універсально.
mirabilos

Гарна знахідка. Але будь-ласка, включіть власний обхідний текст у свій пост або принаймні чітко визначте посилання як посилання stackoverflow. Тобто підхід, який використовує @markoorn, є більш корисним.
nealmcb

38

У мене є інше рішення. Встановити змінну середовища _JAVA_OPTIONS. Я використовував це для наших агентів збірки TeamCity, і тепер наша збірка працює нормально.

_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true

Зміна порушення, позначена як виправлення безпеки, зазвичай не вводиться без жодної причини, і так, коли хтось каже на ТАК, як її відключити ... просто скажіть
berezovskyi

26

Я розмістив більш орієнтований варіант одного з вищезазначених способів вирішення в JIRA . Додати до ~/.m2/settings.xml:

<profile>
    <id>SUREFIRE-1588</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
    </properties>
</profile>

Це не вдається з таким попередженням:[WARNING] Expected root element 'settings' but found 'profile' (position: START_TAG seen <profile>... @1:9) @ /home/nikolai/.m2/settings.xml, line 1, column 9
Микола

3
@Nikolai Вищенаведений фрагмент потрібно включити <settings><profiles>...</profiles></settings>.
qqx

13

У мене виникла ця проблема в моїй збірці CI GitLab, яка використовувала maven:3.5.4-jdk-8зображення Докера.

Змінивши її, щоб maven:3.5.4-jdk-8-alpineвирішити проблему.


8

Я перейшов за цим посиланням 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

Це знову погана практика. Правильний варіант - оновити версію. Завжди перевіряйте версії в Maven Central .
tibor17

5

Тим, хто шукає відповідь, пов’язану з Docker Maven: 3.5.x-jdk-8 на Cit GitLab, див. Цю проблему GitHub .

Здається, 3.5.4-jdk-8зображення призвело до оновлення до другої версії Java, що якимось чином впливає на механізм розгортання Surefire.

Відкат до 3.5.3-jdk-8зображення зафіксував це для мене на моєму сервері GitLab CI, що будує код Java 1.8 з Surefire 2.20.1.


5

Наведена вище пропозиція встановити властивість "-Djdk.net.URLClassPath.disableClassPathURLCheck = true" для мене НЕ працює, але встановлення наступного працює ОК:

-DforkCount=0

2
Це призводить до того, що не створюється новий VM для запуску тестів, тому тести, можливо, можуть впливати на основний VM збірки.
Paŭlo Ebermann

4

Для 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 .


Чому хтось пропонує встановити версію без патчів безпеки ?! Хоча інші пропозиції включають пропуск тестів, так.
березівський

1
Вам більше не потрібно :-) Це виправлено. Але тим часом у мене було багато проектів java, над якими я мав працювати, і час мого виконання Java ніде не піддавався жодному новому коду ззовні. Таким чином, був надзвичайний ризик, який був для мене нормальним. Зрештою, це рішення кожного :-)
flob

Насправді ви маєте рацію, я виявив, що розробники JDK повернулися до цього реквізиту за замовчуванням: hg.openjdk.java.net/jdk/jdk/rev/f54dcfc5a5f8 ; але фактично оновлення версії до вірного файлу не здається найкращим для мене виправленням.
березівський

1
Абсолютно! Але зміни, які вони мали внести, є протягом усієї бази коду та дуже інвазивні. Таким чином, незначна зміна версії для цього виправлення не буде варіантом надійної пожежі.
flob

1
І , на жаль, 2.x припинено , і ми повинні зробити перемикач раніше , ніж пізніше: issues.apache.org/jira/browse / ...
Березовський

2

Я додав залежність до двигуна junit-jupiter, і він працював.

<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>

Яку чорну магію робить цей юпітер-плагін? Це працювало для мене! Оновлення! :-)
Хіноторі

1

Нещодавно я налаштував роботу на Дженкінс і потрапив у ту ж проблему. Я прийняв пропозицію змінити змінну 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"

1

Додавши це до плагіна maven-surefire, я вирішив проблему:

    <plugin>    
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId>  
        <configuration>
            <forkCount>0</forkCount>
        </configuration>
    </plugin>

1

В основному це несумісність між версією JDK і версією плагіна Maven-surefire, в моєму випадку JDK 11.0.5 не працює з surefire 3.0.0-M4, мені довелося перейти на 3.0.0-M3 і воно спрацювало. встановлення forkCount у 0 не усуває проблему, оскільки вона порушує звіт Jacoco.


0

Я видалив 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

0

Я зіткнувся з тією ж проблемою з gitlab ci, змінивши зображення Maven з maven:3-jdk-8на, maven:3.6.0-jdk-8-alpineздається, вирішує проблему. До речі, я також тестував, maven:3.6.0-jdk-8але це не працювало.


0

Це по - , як і раніше є проблемою для surefire - v2.22.2з maven:3.6-jdk-8-alpine. Щоб вирішити проблему, додайте наведений нижче код pom.xml(як плагін Maven)

...
<plugin>    
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId>  
    <configuration>
        <forkCount>0</forkCount>
    </configuration>
</plugin>
...

-1

Якщо мені подобається, у вас є проблеми з вашим конвеєром (для мене це GitLab, але все, що завгодно), і якщо ви використовуєте зображення Maven JDK 8 Docker.

Ви можете замінити

image: maven:3.5.4-jdk-8

останньою робочою збіркою

image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b

1
Проблема виходить з останнього jdk8 для debian, на мою думку, краще "виправити" основну проблему, ніж намагатися її обійти.
Силордіс

Sha256 звучить хитро і боїшся ти? Насправді інша відповідь більше нагадує обхід, вимкнення якоїсь функції з надійного вогню, тут мова йде лише про використання останнього зображення робочого докера, не змінюючи робочу пам’ять чи конвеєр, що є проблемою.
amdev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.