Spring Boot не запускается maven-surefire-plugin ClassNotFoundException org.apache.maven.surefire.booter.ForkedBooter

При запуске maven (3.5.2) сборки приложения Spring Boot 2.0.2.RELEASE (генерируемого веб-инициализатором с веб-зависимостями) происходит сбой при запуске maven-surefire-plugin, говоря просто:

Ошибка: не удалось найти или загрузить основной класс org.apache.maven.surefire.booter.ForkedBooter

Вызвано: 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.unitils</groupId>
        <artifactId>unitils</artifactId>
        <version>2.2</version>
        <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>

Ответ 1

useSystemClassLoader для этой проблемы состоял в том, чтобы переопределить определение Spring maven-surefire-plugin Spring Boot и установить для 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>

Ответ 2

Решение <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>

Ответ 3

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

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

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

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

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

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

Ответ 4

Обновление 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>

Ответ 5

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

<prerequisites>
    <maven>3.6.0</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, которая управляет версией супер-помпа.