web-dev-qa-db-fra.com

Spring Boot ne parvient pas à exécuter le maven-surefire-plugin ClassNotFoundException org.Apache.maven.surefire.booter.ForkedBooter

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>
45
jediz

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>
110
jediz

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>
15

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.

10
peterh

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>
7
rvange

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?

  • Il spécifie la version de Maven que Maven recommande d'utiliser: https://maven.Apache.org/download.cgi
  • lorsque vous exécutez 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.
  • Vous n'avez pas à gérer des versions individuelles de plug-ins indépendamment. Juste votre version minimale maven qui contrôle la version super-pom.
0
GlenPeterson