63 votes

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

Exécution d'une construction maven (3.5.2) d'une Spring Boot L'application 2.0.2.RELEASE (générée par l'initialisateur web avec des dépendances web) ne parvient pas à exécuter la commande maven-surefire-plugin en disant juste :

Erreur : Impossible de trouver ou de charger la classe principale org.apache.maven.surefire.booter.ForkedBooter

Causé par : java.lang. ClassNotFoundException : org.apache.maven.surefire.booter. ForkedBooter

Pourquoi cela se produit-il ? Est-ce un problème dans le démarrage + l'intégration de Surefire = un bug ?

Pour référence, les dépendances qui semblent pertinentes sont les suivantes :

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

0 votes

El problème en amont montre trois solutions de contournement (les deux listées ici, plus forkCount 0), mais aucune n'est sans problème

132voto

jediz Points 144

La solution à ce problème consistait à remplacer la méthode de Spring Boot par une autre méthode. maven-surefire-plugin définition et ensemble useSystemClassLoader à false . Lire Des documents sûrs 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>

3 votes

Oui, je peux confirmer que la solution corrige le problème, mais quel est le problème en coulisses ? - Les nightly builds sur notre système CI étaient soudainement rouges sans aucun changement de code. S'agit-il d'un problème avec Spring Boot ?

5 votes

@agassner take a look at this, I arrived here by este poste

0 votes

Comme indiqué dans l'autre réponse y la question de l'amont cette solution de contournement n'est pas sans poser de problèmes.

21voto

El <useSystemClassLoader>false</useSystemClassLoader> fournie par jediz a permis à mes tests Surefire de s'exécuter, mais a interrompu le chargement des classes dans certains de mes tests d'intégration Spring Boot.

La configuration suivante de maven-surefire-plugin 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>

1 votes

Comme indiqué dans la question de l'amont cette solution de contournement est également non sans problèmes

0 votes

Cette simple option a résolu mon problème qui se produisait dans les versions 1.8 et 11. Merci !

14voto

rvange Points 1832

Cela est dû à une bogue connu dans le plugin Maven Surefire . Il a été corrigé dans la version 3.0.0-M1, qui était publié en novembre 2018 . La solution la plus simple et la plus fiable consiste donc à mettre à jour la version du plugin que vous utilisez.

La mise à jour du plugin maven-surefire-plugin de 2.12.4 à 3.0.0-M1 a fonctionné pour moi. Le projet n'utilisait pas explicitement le plugin, j'ai donc dû ajouter une nouvelle dépendance au plugin.

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

11voto

Peter Horvath Points 2177

Pour moi, la solution était d'exécuter mvn en tant que

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

D'autres idées (donner la propriété system à la liste d'arguments maven, différents changements dans pom.xml , settings.xml ) n'a pas fonctionné.

Malgré le fait qu'il ne contenait pas la solution exacte, aussi cette réponse m'a été très utile pour faire comprendre qu'il s'agit d'une coopération malheureuse entre deux bogues indépendants et inoffensifs dans le JDK Ubuntu et le plugin Surefire de Maven.

La Debian récente (buster) avec les mêmes versions de JDK et Maven ne semble pas affectée par le problème, mais Ubuntu (xenial) l'a été.

La solution exacte vient de este réponse.

Mise à jour du futur : avec Debian Buster is alles okay et cette solution de contournement n'est plus nécessaire.

1voto

GlenPeterson Points 285

J'ai pu supprimer le plugin maven-surefire-plugin de mon POM après avoir ajouté ceci au sommet de mon POM (à l'intérieur de la balise <project> nœud)

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

Pourquoi est-ce que je pense que c'est la bonne réponse ?

  • Elle 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 il montre qu'il prend le maven-surefire-plugin 3.0.0-M3 de super-pom, qui semble jusqu'à présent avoir résolu ce problème.
  • Vous n'avez pas à gérer indépendamment les versions des plugins individuels à l'avenir. Juste votre version maven minimale qui contrôle la version super-pom.

1 votes

J'ai essayé cette solution et voici ce que j'ai obtenu : [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

0 votes

Je l'ai testé avec maven 3.6.0, OpenJDK11, et Spring boot 2.1.X parent. J'ai réussi à résoudre le problème en utilisant rvange 's réponse ci-dessus.

0 votes

Je suis désolé que ma réponse n'ait pas fonctionné pour vous, mais je suis heureux que vous en ayez trouvé une qui a fonctionné ! Mais ma réponse fonctionne toujours bien pour moi, sur plusieurs projets, alors je vais la laisser là.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X