L'exécution de la version maven (3.5.2) d'une application Spring Boot 2.0.2.RELEASE (générée par un initialiseur Web avec des dépendances Web) échoue à l'exécution du maven-surefire-plugin en disant simplement:
Erreur: Impossible de trouver ou de charger la classe principale org.Apache.maven.surefire.booter.ForkedBooter
Causée par: Java.lang. ClassNotFoundException : org.Apache.maven.surefire.booter. ForkedBooter
Pourquoi cela arrive-t-il? Est-ce un problème dans boot + surefire integration = un bug?
Pour référence, les dépendances qui semblent pertinentes sont:
<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>
La solution de contournement pour le problème consistait à remplacer la définition maven-surefire-plugin
de Spring Boot et à définir useSystemClassLoader
sur false
. Lire Surefire docs pour plus de détails
<build>
<plugins>
...
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
La solution <useSystemClassLoader>false</useSystemClassLoader>
fournie par jediz a permis l'exécution de mes tests infaillibles, mais elle a interrompu le chargement de la classe dans certains de mes tests d'intégration Spring Boot.
La configuration de maven-surefire-plugin suivante a fonctionné pour moi:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
</configuration>
</plugin>
Pour moi, la solution consistait à exécuter MVN en tant que
_Java_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean compile package
D'autres idées (attribution de la propriété système à la liste d'arguments maven, modifications différentes dans pom.xml
, settings.xml
) ne fonctionnaient pas.
Malgré le fait qu'il ne contienne pas la solution exacte, aussi cette réponse m'a été très utile pour préciser que c'est une coopération regrettable de deux bogues indépendants et inoffensifs dans le JDK d'Ubuntu et le plugin Maven Surefire .
Les récentes versions de Debian (buster) avec les mêmes versions de JDK et Maven ne semblent pas affectées par le problème, contrairement à Ubuntu (xenial).
La solution exacte vient de this answer.
Mettre à jour le plugin maven-surefire de 2.12.4 à 3.0.0-M1 a fonctionné pour moi. Le projet n'utilisait pas explicitement le plugin, je devais donc ajouter une nouvelle dépendance au plugin.
<plugins>
...
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
...
</plugins>
J'ai pu supprimer le plugin maven-surefire-de mon POM après l'avoir ajouté en haut de mon POM (à l'intérieur du noeud <project>
).
<prerequisites>
<maven>3.6.0</maven>
</prerequisites>
Pourquoi est-ce que je pense que c'est la bonne réponse?
mvn versions:display-plugin-updates
, cela montre que cela prend le maven-surefire-plugin 3.0.0-M3 de super-pom, qui semble avoir résolu ce problème.