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

Каждый раз, когда я запускаю 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?

Я работаю на Debian 9 (Stretch) 64-бит с OpenJDK 1.8.0_181, Maven 3.5.4, работая за прокси моей компании, который я настроил в своем ~ / .m2 / settings.xml.

Странно то, что последняя версия Surefire - 2.22.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)

Sylordis

Ответы (20)

Чтобы исправить это (в 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, вероятно, потребуется дополнительное тестирование (ну, очевидно, должна быть эта загрузка).

Было несколько обходных путей:

  1. Вместо этого вы можете установить предыдущий пакет из snapshots.d.o. После перехода на более раннюю версию вы можете запретить сломанную версию (если вы используете aptitude, а не apt), используя sudo aptitudehibited-version openjdk-8-jre-headless. Для обычного "apt" я не видел аналогичного механизма запрета, поэтому вам, вероятно, придется использовать apt pinning, чтобы предотвратить повторную установку этого обновления (или вы просто продолжаете понижать версию снова, я надеюсь, что это скоро будет решено) *. 100011 *
  2. Согласно отслеживанию ошибок, установка свойства -Djdk.net.URLClassPath.disableClassPathURLCheck = true с помощью любого из обычных методов (например, JAVA_FLAGS) также должна помочь. Но сам я этого не проверял. Очевидно, вы даже можете добавить обходной путь к ~ / .m2 / settings.xml, чтобы легко включить его для всех ваших сборок Maven.

Как видите, отслеживание ошибок работает, проблема сузилась, доступен фиксированный пакет и скоро выйдет новая версия плагина surefire!

Приведенное выше предложение по установке свойства "- Djdk.net.URLClassPath.disableClassPathURLCheck = true" НЕ сработало для меня, но установка следующих параметров работает нормально:

-DforkCount=0

У меня была эта проблема в моей сборке GitLab CI, в которой использовался maven: 3.5.4-jdk-8 образ Docker.

Изменение на maven: 3.5.4-jdk-8-alpine устраняет проблему.

Я столкнулся с той же проблемой с gitlab ci, изменив образ maven с maven: 3-jdk-8 на maven: 3.6.0-jdk-8-alpine кажется исправить проблему. Кстати, я также тестировал maven: 3.6.0-jdk-8, но он тоже не работал.

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

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

Я нашел этот обходной путь и исправил свои тесты: настройте maven-surefire-plugin, чтобы не использовать системный загрузчик классов.

Я опубликовал более целевой вариант одного из описанных выше обходных путей в JIRA. Добавить в ~ / .m2 / settings.xml:


    SUREFIRE-1588
    
        true
    
    
        -Djdk.net.URLClassPath.disableClassPathURLCheck=true
    

Добавив это в maven-surefire-plugin, я решил проблему:

        
        org.apache.maven.plugins 
        maven-surefire-plugin  
        
            0
        
    

При использовании GitLab CI / CD с изображением 3.6.0-jdk-8 помогло только указанное ниже свойство (без изменения pom.xml).

-Dsurefire.useSystemClassLoader=false

Это все еще проблема для surefire - v2.22.2 с maven: 3.6-jdk-8-alpine. Чтобы решить эту проблему, добавьте приведенный ниже код в pom.xml (как плагин maven)

...
    
    org.apache.maven.plugins 
    maven-surefire-plugin  
    
        0
    

...

Я добавил зависимость для junit-jupiter-engine, и это сработало.


    org.apache.maven.plugins
    maven-surefire-plugin
    2.22.1
    
        
            org.junit.jupiter
            junit-jupiter-engine
            5.4.0
        
    

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

Я перешел по этой ссылке https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html и добавил плагин ниже в pom.xml, и он сработал,


  [...]
  
    
      
        org.apache.maven.plugins
        maven-surefire-plugin
        2.22.1
        
          false
        
      
    
  
  [...]

Для меня в Visual Studio Code

Я не вносил никаких изменений в файл pom.xml и не обновлял какие-либо версии зависимостей
Добавление этой строки в settings.json кода Visual Studio решило проблему.

"maven.executable.options": "-DforkCount=0",

Установите для useSystemClassloader значение false:


    org.apache.maven.plugins
    maven-surefire-plugin
    
        false
    

Если вы не наследуете родительский элемент, версия которого определена для вас (например, стартер Spring Boot), вам также необходимо определить его.

Я недавно настроил maven job на Jenkins и застрял в той же проблеме. Я принял предложение изменить переменную env JAVA и подтвердить, что проблема решена. Вот как я тестировал.

Станет пользователем 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"

Если, как и у меня, у вас есть проблемы в конвейере (для меня это в GitLab, но что угодно), и если вы используете образ Docker Maven JDK 8.

Можно заменить

image: maven:3.5.4-jdk-8

по последней рабочей сборке

image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b

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

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

Для тех, кто ищет ответ, связанный с 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.

2022 WebDevInsider