Spring Boot не может запустить maven-surefire-plugin ClassNotFoundException org.apache.maven.surefire.booter.ForkedBooter

Запуск сборки maven (3.5.2) приложения Весенний ботинок 2.0.2.RELEASE (сгенерированный веб-инициализатором с веб-зависимостями) не выполняет плагин maven-surefire, говоря просто:

Error: Could not find or load main class org.apache.maven.surefire.booter.ForkedBooter

Caused by: java.lang.ClassNotFoundException: org.apache.maven.surefire.booter.ForkedBooter

Почему это происходит? Это проблема в загрузке + надежная интеграция = ошибка?

Для справки, зависимости, которые кажутся важными, следующие:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/>
</parent>
...
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
</dependency>
...
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
</dependency>
...
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

проблема апстрима показывает три обходных пути (два перечисленных здесь плюс forkCount 0), но ни один из них не обходится без проблем ☹

mirabilos 31.10.2018 15:44
62
1
29 641
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Обходной путь для проблемы состоял в том, чтобы переопределить определение Spring Boot maven-surefire-plugin и установить для useSystemClassLoader значение false. Прочтите Документы Surefire для более подробной информации.

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

Да, я могу подтвердить, что решение устраняет проблему, но в чем проблема? - Ночные сборки в нашей системе CI внезапно стали красными без каких-либо изменений кода. Это проблема с Spring Boot?

agassner 29.10.2018 17:47

@agassner, взгляни на это, я прибыл сюда по сообщению это

Ordiel 29.10.2018 20:11

Как сказано в другой ответ и проблема апстрима, этот обходной путь не без проблем.

mirabilos 31.10.2018 15:43

Это исправление сработало для меня, однако я получил предупреждение о том, что версия должна быть предоставлена ​​/ указана. Чтобы избежать ошибок в будущем, я рекомендую добавить его. На данный момент, кажется, самая последняя версия - <version> 2.22.1 </version>.

Mark 01.11.2018 12:02

нужно установить версию, чтобы не получать предупреждения maven при сборке. изменить: как все еще сказано в предыдущем комментарии

Kaspatoo 21.11.2018 14:25

@Kaspatoo версия была унаследована от загрузки Spring, что является одной из его основных функций - она ​​должна определять совместимые версии для вашего.

jediz 22.11.2018 00:21

Решение <useSystemClassLoader>false</useSystemClassLoader>, предоставленное jediz, позволяло выполнять мои надежные тесты, но нарушало загрузку классов в некоторых из моих интеграционных тестов Spring Boot.

У меня сработала следующая конфигурация maven-surefire-plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
    </configuration>
</plugin>

Как сказано в проблема апстрима, этот обходной путь - также, не без проблем ☹

mirabilos 31.10.2018 15:44

Этот простой вариант решил мою проблему, которая возникла как в 1.8, так и в 11. Спасибо!

Wedson Quintanilha da Silva 16.06.2021 21:45

Это связано с известная ошибка в плагине Maven Surefire. Это было исправлено в версии 3.0.0-M1, которая была выпущен в ноябре 2018 г.. Итак, самое простое и надежное решение - обновить ту версию плагина, которую вы используете.

У меня сработало обновление maven-surefire-plugin с 2.12.4 до 3.0.0-M1. В проекте плагин явно не использовался, поэтому мне пришлось добавить новую зависимость плагина.

<plugins>
   ...
   <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M1</version>
   </plugin>
   ...
</plugins>

Для меня решением было запустить mvn как

_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean compile package

Другие идеи (передача системного свойства списку аргументов maven, различные изменения в pom.xml, settings.xml) не сработали.

Несмотря на то, что он не содержал точного решения, этот ответ также был очень полезен для меня, чтобы прояснить, что это неудачное сотрудничество двух независимых, безобидных ошибок в Ubuntu JDK и Maven Surefire Plugin.

Недавний Debian (buster) с теми же версиями JDK и Maven, похоже, не затронут этой проблемой, но Ubuntu (xenial) затронул.

Точное решение исходит из ответа это.

Update from the future: with Debian Buster is alles okay and this workaround is not needed any more.

Мне удалось удалить maven-surefire-plugin из моего POM после добавления его в верхнюю часть моего POM (внутри узла <project>)

<prerequisites>
    <maven>3.6.3</maven>
</prerequisites>

Почему я думаю, что это правильный ответ?

  • Он указывает версию Maven, которую Maven рекомендует использовать: https://maven.apache.org/download.cgi
  • когда вы запускаете mvn versions:display-plugin-updates, он показывает, что он берет maven-surefire-plugin 3.0.0-M3 из super-pom, который до сих пор, похоже, исправил эту проблему.
  • Вам не нужно самостоятельно управлять отдельными версиями плагинов. Просто ваша минимальная версия maven, которая контролирует версию super-pom.

Я попробовал это решение и вот что у меня получилось: [WARNING] The project com.example:pom:0.0.2 uses prerequisites which is only intended for maven-plugin projects but not for non maven-plugin projects. For such purposes you should use the maven-enforcer-plugin. See https://maven.apache.org/enforcer/enforcer-rules/requireMave‌​nVersion.html

Raymund Arthur 14.05.2019 09:09

Я тестировал его с родителем maven 3.6.0, OpenJDK11 и Spring boot 2.1.X. Мне удалось решить проблему, используя отвечатьRvange выше.

Raymund Arthur 29.05.2019 06:24

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

GlenPeterson 30.05.2019 17:21

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

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

Добро пожаловать в SO! При ответе, пожалуйста, сделайте больше, чем просто выбросьте код. Вместо этого объясните, почему код должен быть выбранным решением. Цель состоит в том, чтобы научить ОП ловить рыбу, а не просто решить эту текущую проблему с помощью одной рыбы.

the Tin Man 23.03.2020 22:57

Я заметил необходимость в этом только при запуске более старой версии плагина под новой версией Java, например 11. Попробуйте вместо этого последнюю версию плагина.

Matthew Read 18.03.2021 19:40

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