Maven surefire n'a pas pu trouver la classe ForkedBooter

218

En venant récemment à un nouveau projet, j'essaye de compiler notre code source. Tout a bien fonctionné hier, mais aujourd'hui, c'est une autre histoire.

Chaque fois que j'exécute mvn clean installun module, une fois les tests atteints, il se bloque en une erreur:

[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ recorder ---
[INFO] Surefire report directory: /lhome/code/recorder/target/surefire-reports
[INFO] Using configured provider org.apache.maven.surefire.junitcore.JUnitCoreProvider
[INFO] parallel='none', perCoreThreadCount=true, threadCount=0, useUnlimitedThreads=false, threadCountSuites=0,     threadCountClasses=0, threadCountMethods=0, parallelOptimized=true

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Error: Could not find or load main class org.apache.maven.surefire.booter.ForkedBooter

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

et plus tard:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project recorder: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test failed: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?

Je cours sur Debian 9 (Stretch) 64 bits avec OpenJDK 1.8.0_181, Maven 3.5.4, travaillant derrière le proxy de mon entreprise que j'ai configuré dans mon ~/.m2/settings.xml.

Chose étrange, la dernière version de Surefire est la 2.22.1 si je me souviens bien. J'ai essayé de spécifier la version du plugin, mais elle n'est pas mise à jour, sinon il n'y a aucune spécification de version de plugin dans aucun POM (parent, grand-parent ou celui-ci).

J'ai réussi à forcer Maven à changer la dernière version de Surefire, mais maintenant c'est encore pire:

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[...]

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project recorder:     There are test failures.
[ERROR]
[ERROR] Please refer to /lhome/code/recorder/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /lhome/code/recorder/ && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java     '-javaagent:/lhome1/johndoe/.m2/repository/org/jacoco/org.jacoco.agent/0.7.4.201502262128/org.jacoco.agent-0.7.4.201502262128-runt    ime.jar=destfile=/lhome/code/recorder/target/jacoco.exec,append=true,includes=esa/*,excludes=**/api/**/*.class' -jar     /lhome/code/recorder/target/surefire/surefirebooter7426165516226884923.jar /lhome/code/recorder/target/surefire     2018-10-26T16-16-12_829-jvmRun1 surefire1721866559613511529tmp surefire_023400764142672144tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye.     VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /lhome/code/recorder/ && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java     '-javaagent:/lhome1/johndoe/.m2/repository/org/jacoco/org.jacoco.agent/0.7.4.201502262128/org.jacoco.agent-0.7.4.201502262128-runt    ime.jar=destfile=/lhome/code/recorder/target/jacoco.exec,append=true,includes=esa/*,excludes=**/api/**/*.class' -jar     /lhome/code/recorder/target/surefire/surefirebooter7426165516226884923.jar /lhome/code/recorder/target/surefire     2018-10-26T16-16-12_829-jvmRun1 surefire1721866559613511529tmp surefire_023400764142672144tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:669)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
[ERROR]     at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
[ERROR]     at     org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
[ERROR]     at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
[ERROR]     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
[ERROR]     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
[ERROR]     at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
[ERROR]     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR]     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
[ERROR]     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
[ERROR]     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
[ERROR]     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:954)
[ERROR]     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
[ERROR]     at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
[ERROR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]     at java.lang.reflect.Method.invoke(Method.java:498)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
[ERROR]     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Sylordis
la source
1
J'ai ce bug dans clircle-ci. Surefire forks et forked vm imprime le message suivant et se termine: "Erreur: impossible de trouver ou de charger la classe principale org.apache.maven.surefire.booter.ForkedBooter". Le massage est dans la cible / surefire-reports / *. Dumpstream. Si vous exécutez maven avec -X, il imprime la ligne de commande, vous pouvez l'essayer et voir le vm imprimer ce message.
Bruno Coutinho
ma solution était d'arrêter d'utiliser open-jdks de n'importe quelle version. ne peut pas se permettre ce genre de manque de fiabilité dans quelque chose d'aussi fondamental.
Adrian M.
Utilisez la dependencyManagementsection de
maven
La mise à jour vers jdk 11 sur Debian était une solution infaillible pour moi!
clearlight

Réponses:

251

Pour y remédier (en 2018), mettez à jour votre openjdk vers la dernière version, au moins 8u191-b12. Au cas où ce problème réapparaîtrait en 2020, il est probable que le comportement par défaut de openjdk ait été modifié, et vous devrez ensuite mettre à jour le plugin maven surefire.

Ce fut maintenant un fixe bug dans le paquet openjdk-8 (le comportement s'écarte de manière significative sans besoin; manque le correctif en amont pour revenir à la désactivation d'un contrôle de sécurité) que vous venez de mettre à niveau. Mais c'est aussi un bug dans le plugin surefire, SUREFIRE-1588 , censé être corrigé dans surefire 3.0.0-M1 : il utilise apparemment des chemins absolus dans un endroit où Java n'autorisera à l'avenir que des noms de chemins relatifs (et Debian a activé le comportement futur déjà).

La version du package 8u181-b13-2 indique:

  • Appliquez les correctifs de la mise à jour de sécurité 8u191-b12.

Notez que 191-b12! = 181-b13. Les correctifs de sécurité 191-b12 venaient de sortir il y a quelques jours, et apparemment les responsables voulaient vous les obtenir rapidement. La mise à jour complète vers 191-b12 nécessitera probablement des tests supplémentaires (enfin, devrait donc avoir ce téléchargement, apparemment).

Il y avait eu plusieurs solutions:

  1. Vous pouvez installer le package précédent à partir de snapshots.do à la place. Après la rétrogradation, vous pouvez interdire la version cassée (si vous utilisez aptitude et nonapt ) sudo aptitude forbid-version openjdk-8-jre-headless. Pour les "apt" réguliers, je n'ai pas vu de mécanisme d'interdiction similaire, vous devrez donc probablement utiliser l'épinglage apt pour empêcher la réinstallation de cette mise à niveau (ou vous continuez simplement à rétrograder, j'espère que cela sera bientôt résolu).
  2. Selon le suivi des bogues, la définition de la propriété -Djdk.net.URLClassPath.disableClassPathURLCheck=trueavec l'une des méthodes habituelles (par exemple, JAVA_FLAGS) devrait également aider. Mais je ne l'ai pas vérifié moi-même. Vous pouvez apparemment même ajouter la solution de contournement à~/.m2/settings.xml activer facilement pour toutes vos versions de Maven.

Comme vous pouvez le voir, le suivi des bogues fonctionne , le problème a été résolu et un package fixe est disponible et une nouvelle version du plugin surefire arrivera bientôt!

Erich Schubert
la source
@AdrianMadaras Je n'ai pas eu de nouvelle mise à jour jusqu'à présent, seulement la version -2. Il n'y a pas encore eu d'annonce d'un téléchargement fixe, mais c'est en cours. Vous venez probablement de mettre à niveau la version problématique connue.
Erich Schubert
1
Je viens de recevoir le même problème sur Ubuntu 18.04, en utilisant OpenJDK 10.0.2. Passer le JAVA_HOME à mon installation 'java-9-oracle' l'a corrigé.
RobAu
2
Voici le problème correspondant dans le suivi des problèmes de surefire-maven-plugin: issues.apache.org/jira/browse/SUREFIRE-1588 (c'est toujours un bogue dans le backport Canonical / Debian des modifications pertinentes d'OpenJDK).
mirabilos
1
Contournement 1. n'a pas de sens pour moi car c'est la version sur laquelle je rencontre le problème. Remplacer le plugin maven-surefire pour ne pas utiliserSystemClassLoader n'a pas fonctionné non plus
Edwin Diaz-Mendez
1
Vous pouvez également essayer la mise à niveau vers surefire 3.0.0-M1. Mais une version 2 à 3 jalons peut bien sûr casser d'autres choses.
Erich Schubert
54

Définissez useSystemClassloader sur false:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
</plugin>

Si vous n'héritez pas d'un parent dont la version a été définie pour vous (comme le démarreur Spring Boot), vous devrez également le définir.

Markoorn
la source
L'activation du chargeur de classe système est la pire pratique car vous exécutez les tests dans le processus de plug-in. La bonne pratique consiste à mettre à niveau la version de chaque plugin. Maven 3.7.0 mettra à niveau les versions de tous les plugins qui appartiennent au cycle de vie par défaut. Le Spring ne doit pas s'en tenir aux anciennes versions et ne doit pas non plus les remplacer. Cela entraîne des conflits de responsabilités inutiles.
tibor17
52

J'ai trouvé cette solution de contournement et corrigé mes tests: configurez le maven-surefire-pluginpour ne pas utiliser le chargeur de classe système.

user3090935
la source
Selon le mainteneur de maven-surefire-plugin, toutes les solutions de contournement (ce paramètre, la définition forkCountde 0 ou la définition argLineglobale) ont des problèmes et ne peuvent pas être appliquées universellement.
mirabilos
Bonne trouvaille. Mais veuillez inclure le texte de contournement réel dans votre message, ou au moins identifier clairement le lien en tant que lien de stackoverflow. C'est-à-dire que l'approche utilisée par @markoorn est plus utile.
nealmcb
38

J'ai une autre solution de contournement. Définissez la variable d'environnement _JAVA_OPTIONS. J'ai utilisé cela pour nos agents de build TeamCity et maintenant nos builds fonctionnent bien.

_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true
Michael
la source
Un changement de rupture étiqueté comme un correctif de sécurité n'est généralement pas introduit sans raison et pour que quelqu'un dise à SO comment le désactiver ... juste en disant
berezovskyi
26

J'ai publié une variante plus ciblée de l'une des solutions ci-dessus dans JIRA . Ajouter à ~/.m2/settings.xml:

<profile>
    <id>SUREFIRE-1588</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
    </properties>
</profile>
Jesse Glick
la source
Cela échoue avec l'avertissement suivant:[WARNING] Expected root element 'settings' but found 'profile' (position: START_TAG seen <profile>... @1:9) @ /home/nikolai/.m2/settings.xml, line 1, column 9
Nikolai
3
@Nikolai L'extrait ci-dessus doit être inclus <settings><profiles>...</profiles></settings>.
qqx
13

J'ai eu ce problème dans ma build GitLab CI, qui utilisait l' maven:3.5.4-jdk-8image Docker.

Le changer pour maven:3.5.4-jdk-8-alpinerésoudre le problème.

brunobastosg
la source
8

J'ai suivi ce lien https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html et ajouté le plugin ci-dessous dans pom.xml et cela a fonctionné,

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.1</version>
        <configuration>
          <useSystemClassLoader>false</useSystemClassLoader>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
Arunkumar Arjunan
la source
8

Lors de l'utilisation de GitLab CI / CD avec 3.6.0-jdk-8image, seule la propriété ci-dessous a aidé (sans modifier pom.xml).

-Dsurefire.useSystemClassLoader=false
Grzes
la source
C'est encore une mauvaise pratique. La bonne consiste à mettre à niveau la version. Vérifiez toujours les versions dans Maven Central .
tibor17
5

Pour ceux qui recherchent une réponse liée à Docker Maven: 3.5.x-jdk-8 sur GitLab CI, consultez ce problème GitHub .

Il semble qu'une 3.5.4-jdk-8image ait entraîné une mise à niveau vers une version Java mineure qui affecte en quelque sorte le mécanisme de forking de Surefire.

Revenir à l' 3.5.3-jdk-8image a corrigé cela pour moi sur mon serveur GitLab CI qui construit le code Java 1.8 avec Surefire 2.20.1.

Simon Diemert
la source
5

La suggestion ci-dessus pour définir la propriété "-Djdk.net.URLClassPath.disableClassPathURLCheck = true" n'a PAS fonctionné pour moi, mais la définition de ce qui suit fonctionne correctement:

-DforkCount=0
farid g.
la source
2
Cela a pour effet de ne pas créer de nouvelle machine virtuelle pour exécuter les tests, de sorte que les tests peuvent éventuellement influencer la machine virtuelle de génération principale.
Paŭlo Ebermann
4

Pour Ubuntu: installez la dernière version, ce bug a été corrigé

sudo apt-get update ; sudo apt-get dist-upgrade -y

Installez la dernière version de travail (sans correctifs de sécurité) sans le bogue.

sudo apt-get install openjdk-8-jdk-headless=8u181-b13-1 openjdk-8-jdk=8u181-b13-1  openjdk-8-jre=8u181-b13-1  openjdk-8-jre-headless=8u181-b13-1 openjdk-8-source=8u181-b13-1

Si vous avez manqué cette version, utilisez la version précédente:

sudo apt-get install openjdk-8-jdk-headless=8u162-b12-1 openjdk-8-jdk=8u162-b12-1  openjdk-8-jre=8u162-b12-1  openjdk-8-jre-headless=8u162-b12-1 openjdk-8-source=8u162-b12-1

Utilisez ensuite soit l' épinglage ou faites attention à ne pas installer la version cassée.

L'utilisation -Djdk.net.URLClassPath.disableClassPathURLCheck=truen'a pas fonctionné pour moi partout où j'avais mis cette configuration. Quelque part dans mes tests d'intégration, il s'est toujours arrêté sans l'ancienne version Java.

Comme mentionné par Erich, c'est un bogue dans le paquet Debian étant trop strict 911925 et le plugin Surefire n'agissant pas selon les nouvelles règles SUREFIRE-1588 .

flob
la source
Pourquoi est-ce que quelqu'un suggérerait d'installer une version sans correctifs de sécurité?! Bien que d'autres suggestions incluent des sauts de tests, hein.
berezovskyi
1
Vous n'en avez plus besoin :-) C'est réparé. Mais en attendant, j'avais de nombreux projets java sur lesquels je devais travailler et mon runtime java n'était exposé à aucun nouveau code de l'extérieur. Il y avait donc un risque supervisé qui était OK pour moi. Après tout, c'est la décision de chacun :-)
flob
En fait, vous avez raison, j'ai trouvé que les développeurs JDK sont revenus sur cet ensemble d'accessoires par défaut: hg.openjdk.java.net/jdk/jdk/rev/f54dcfc5a5f8 ; mais la mise à niveau de la version majeure vers infaillible ne semble pas être la meilleure solution pour moi, en fait.
berezovskyi
1
Absolument! Mais les changements qu'ils ont dû faire sont dans toute la base de code et très invasifs. Un changement de version mineur pour ce correctif ne serait donc pas une option dans infaillible.
flob
1
Et malheureusement, 2.x est interrompu et nous devrons faire un changement plus tôt que tard: issues.apache.org/jira/browse/…
berezovskyi
2

J'ai ajouté une dépendance à junit-jupiter-engine, et cela a fonctionné.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.4.0</version>
        </dependency>
    </dependencies>
</plugin>
Adi Baboianu
la source
Quelle magie noire ce plugin jupiter fait-il? Cela a fonctionné pour moi! Upvote! :-)
Hinotori
1

J'ai récemment configuré le travail maven sur Jenkins et suis resté coincé dans le même problème. J'ai pris la suggestion de modifier la variable env JAVA et de confirmer le problème résolu. C'est ainsi que j'ai testé.

Devient un utilisateur "jenkins" et change le dossier en nom de projet d'espace de travail que vous avez configuré pour le travail.

 $ _JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean install -U

 $ lsb_release -rd
 Description:   Ubuntu 16.04.5 LTS
 Release:   16.04

 $ mvn -v
 Apache Maven 3.3.9
 Maven home: /usr/share/maven
 Java version: 1.8.0_181, vendor: Oracle Corporation
 Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
 Default locale: en_US, platform encoding: UTF-8
 OS name: "linux", version: "4.4.0-131-generic", arch: "amd64", family: "unix"
Boonchu Ngampairoijpibul
la source
1

En ajoutant ceci au plugin maven-surefire, j'ai résolu le problème:

    <plugin>    
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId>  
        <configuration>
            <forkCount>0</forkCount>
        </configuration>
    </plugin>
Ruben Romero
la source
1

Fondamentalement, il y a une incompatibilité entre la version JDK et la version du plugin maven-surefire, dans mon cas, JDK 11.0.5 ne fonctionne pas avec surefire 3.0.0-M4, j'ai dû passer à 3.0.0-M3 et cela a fonctionné. définir forkCount à 0 ne résout pas le problème car il rompt le rapport Jacoco.

apolo884
la source
0

J'ai désinstallé le JDK fourni dans les référentiels:

$ sudo apt purge openjdk-8-jdk

$ sudo apt autoremove

J'ai ensuite supprimé la JAVA_HOMEvariable d'environnement. Le mien a été placé dans mon .bashrc.

Ensuite, je l'ai réinstallé via SDKMAN:

$ sdk install java 8.0.181-zulu

Depuis leur site :

SDKMAN! est un outil pour gérer les versions parallèles de plusieurs kits de développement logiciel sur la plupart des systèmes basés sur Unix. Il fournit une interface de ligne de commande (CLI) et une API pratiques pour installer, changer, supprimer et répertorier les candidats.

Pour voir d'autres versions du JDK à installer, utilisez:

$ sdk list java
jumpnett
la source
0

Je faisais face à la même question avec gitlab ce ci, en changeant l' image de maven maven:3-jdk-8à maven:3.6.0-jdk-8-alpinesemble résoudre le problème. Btw j'ai également testé avec maven:3.6.0-jdk-8mais cela n'a pas fonctionné non plus.

mndeveci
la source
0

C'est toujours un problème surefire - v2.22.2avec maven:3.6-jdk-8-alpine. Pour résoudre le problème, ajoutez le code ci-dessous à pom.xml(en tant que plugin maven)

...
<plugin>    
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId>  
    <configuration>
        <forkCount>0</forkCount>
    </configuration>
</plugin>
...
KimchiMan
la source
-1

Si comme moi, vous avez des problèmes dans votre pipeline (pour moi, c'est dans GitLab, mais peu importe) et si vous utilisez une image Docker Maven JDK 8.

Vous pouvez remplacer

image: maven:3.5.4-jdk-8

par la dernière version de travail

image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b
amdev
la source
1
Le problème vient du dernier jdk8 pour debian, à mon avis, il vaut mieux "résoudre" le problème principal que d'essayer de le contourner.
Sylordis
Le sha256 sonne délicat et vous fait peur? En fait, l'autre réponse ressemble plus à une solution de contournement, désactivez certaines fonctionnalités de surefire, ici, il s'agit simplement d'utiliser la dernière image docker qui fonctionne sans changer votre pom ou pipeline de travail qui est une solution.
amdev