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