Maven surefire non è riuscito a trovare la classe ForkedBooter


218

Di recente sto arrivando a un nuovo progetto, sto cercando di compilare il nostro codice sorgente. Tutto ha funzionato bene ieri, ma oggi è un'altra storia.

Ogni volta che eseguo mvn clean installun modulo, una volta raggiunti i test, si blocca in un errore:

[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

e più tardi:

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

Sto correndo su Debian 9 (Stretch) a 64 bit con OpenJDK 1.8.0_181, Maven 3.5.4, lavorando dietro il mio proxy aziendale che ho configurato nel mio ~/.m2/settings.xml.

Una cosa strana è che l'ultima versione di Surefire è la 2.22.1 se ricordo bene. Ho provato a specificare la versione del plug-in, ma non viene aggiornata, altrimenti non esiste alcuna specifica della versione del plug-in in nessun POM (genitore, nonno o questo).

Sono riuscito a forzare Maven a cambiare la versione di Surefire con l'ultima, ma ora è anche peggio:

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

1
Sto riscontrando questo bug in clircle-ci. Surefire fork e vm biforcuti stampa il seguente messaggio ed esce: "Errore: Impossibile trovare o caricare la classe principale org.apache.maven.surefire.booter.ForkedBooter". Il massaggio è nel dumpstream target / surefire-reports / *. Se esegui maven con -X stampa la riga di comando, puoi provarlo e vedere la vm che stampa questo messaggio.
Bruno Coutinho,


la mia soluzione era smettere di usare open-jdks di qualsiasi versione. non può permettersi questo tipo di inaffidabilità in qualcosa di così fondamentale.
Adrian M.,

Usa la dependencyManagementsezione di
maven

L'aggiornamento a jdk 11 su Debian è stata una soluzione infallibile per me!
chiarimento

Risposte:


251

Per risolverlo (nel 2018), aggiorna il tuo openjdk all'ultima versione, almeno 8u191-b12. Nel caso in cui questo problema si ripresenti nel 2020, è probabile che il comportamento predefinito di openjdk sia stato modificato e sarà quindi necessario aggiornare il plugin maven surefire.

Questo era un bug ora corretto nel pacchetto openjdk-8 (il comportamento si discosta significativamente dall'upstream senza necessità; manca la patch upstream per ripristinare la disabilitazione di un controllo di sicurezza) a cui è appena stato eseguito l' aggiornamento. Ma è anche un bug nel plugin surefire, SUREFIRE-1588 , presumibilmente corretto in surefire 3.0.0-M1 : apparentemente sta usando percorsi assoluti in un posto dove Java in futuro consentirà solo nomi di percorsi relativi (e Debian ha attivato il comportamento futuro già).

La versione del pacchetto 8u181-b13-2 afferma:

  • Applica le patch dall'aggiornamento della sicurezza 8u191-b12.

Nota che 191-b12! = 181-b13. Le patch di sicurezza 191-b12 erano appena uscite pochi giorni fa e apparentemente i manutentori volevano farle arrivare velocemente. L'aggiornamento completo a 191-b12 probabilmente richiederà ulteriori test (beh, quindi dovrebbe avere questo upload, a quanto pare).

C'erano stati diversi workaounds:

  1. È invece possibile installare il pacchetto precedente da snapshots.do . Dopo il downgrade, è possibile vietare l'utilizzo della versione non funzionante (se si utilizza aptitude e non apt) sudo aptitude forbid-version openjdk-8-jre-headless. Per il normale "apt" non ho visto un meccanismo di proibizione simile, quindi probabilmente avresti bisogno di usare il pin di apt per impedire la reinstallazione di questo aggiornamento (o continui a declassare, spero che questo verrà risolto presto).
  2. Secondo il tracciamento dei bug, anche l'impostazione della proprietà -Djdk.net.URLClassPath.disableClassPathURLCheck=truecon uno dei metodi usuali (ad es. JAVA_FLAGS) Dovrebbe aiutare. Ma non l'ho verificato da solo. Apparentemente puoi anche aggiungere la soluzione alternativa per~/.m2/settings.xml abilitarla facilmente per tutte le tue build Maven.

Come puoi vedere, il tracciamento dei bug funziona , il problema è stato ridotto e un pacchetto fisso è disponibile e una nuova versione del plugin surefire arriverà presto!


@AdrianMadaras Finora non ho ricevuto un nuovo aggiornamento, solo la versione -2. Inoltre, non è stato ancora annunciato alcun caricamento fisso, ma è in corso. Probabilmente hai appena aggiornato alla versione problematica nota.
Erich Schubert,

1
Ho appena avuto lo stesso problema su Ubuntu 18.04, usando OpenJDK 10.0.2. Il passaggio di JAVA_HOME alla mia installazione 'java-9-oracle' l'ha risolto.
RobAu,

2
Ecco il problema corrispondente nel tracker dei problemi di surefire-maven-plugin: issues.apache.org/jira/browse/SUREFIRE-1588 (è ancora un bug nel backport Canonical / Debian delle relative modifiche OpenJDK).
mirabilos,

1
Lavorare intorno a 1. non ha senso per me in quanto questa è la versione su cui sto riscontrando il problema. Anche l'override del plugin maven-surefire per non utilizzare SystemClassLoader non funzionava
Edwin Diaz-Mendez

1
Puoi anche provare ad aggiornare a surefire 3.0.0-M1. Ma una versione da 2 a 3 milestone può ovviamente infrangere altre cose.
Erich Schubert,

54

Impostare useSystemClassloader su false:

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

Se non stai ereditando da un genitore che ha una versione definita per te (come lo starter di Spring Boot), dovrai definire anche quello.


Abilitare il classloader di sistema è la peggiore pratica a causa di te che stai eseguendo i test nel processo di plugin. La pratica giusta è aggiornare la versione di ogni plugin. Maven 3.7.0 aggiornerà le versioni di tutti i plugin che appartengono al ciclo di vita predefinito. La primavera non dovrebbe attenersi alle vecchie versioni e non dovrebbe nemmeno sostituirle. Ciò provoca inutili conflitti di responsabilità.
tibor17

52

Ho trovato questa soluzione alternativa e risolto i miei test: configurare il maven-surefire-pluginnon usare il classloader di sistema.


Secondo il manutentore del plugin maven-surefire, tutte le soluzioni alternative (questa impostazione forkCountsu 0 o impostazione argLineglobale) hanno problemi e non possono essere applicate universalmente.
mirabilos,

Buona scoperta. Tuttavia, includi il testo della soluzione alternativa nel tuo post o almeno identifica chiaramente il link come link stackoverflow. Vale a dire l'approccio utilizzato da @markoorn è più utile.
nealmcb,

38

Ho un'altra soluzione alternativa. Imposta la variabile di ambiente _JAVA_OPTIONS. L'ho usato per i nostri agenti di build di TeamCity e ora le nostre build funzionano bene.

_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true

Un cambiamento di rottura etichettato come una correzione di sicurezza di solito non viene introdotto senza motivo e quindi qualcuno dice a SO come disabilitarlo ... basta dire '
berezovskyi

26

Ho pubblicato una variante più mirata di una delle soluzioni di cui sopra in JIRA . Aggiungi a ~/.m2/settings.xml:

<profile>
    <id>SUREFIRE-1588</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
    </properties>
</profile>

Questo fallisce con il seguente avvertimento:[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 Lo snippet sopra riportato deve essere racchiuso in <settings><profiles>...</profiles></settings>.
qqx

13

Ho riscontrato questo problema nella mia build di GitLab CI, che utilizzava l' maven:3.5.4-jdk-8immagine Docker.

Modificandolo per maven:3.5.4-jdk-8-alpinerisolvere il problema.



8

Quando si utilizza GitLab CI / CD con l' 3.6.0-jdk-8immagine, solo la proprietà seguente ha aiutato (senza modificare pom.xml).

-Dsurefire.useSystemClassLoader=false

Questa è di nuovo una cattiva pratica. Quello giusto è aggiornare la versione. Controlla sempre le versioni in Maven Central .
tibor17

5

Per coloro che cercano una risposta relativa a Docker Maven: 3.5.x-jdk-8 su GitLab CI, vedere questo problema di GitHub .

Sembra a 3.5.4-jdk-8 immagine abbia comportato l'aggiornamento a una versione Java minore che in qualche modo influenza il meccanismo di fork di Surefire.

Il rollback 3.5.3-jdk-8all'immagine ha risolto questo problema sul mio server GitLab CI costruendo il codice Java 1.8 con Surefire 2.20.1.


5

Il suggerimento sopra per impostare la proprietà "-Djdk.net.URLClassPath.disableClassPathURLCheck = true" NON ha funzionato per me, ma l'impostazione di quanto segue funziona OK:

-DforkCount=0

2
Ciò ha l'effetto di non creare una nuova VM per l'esecuzione dei test, quindi i test possono eventualmente influenzare la VM di build principale.
Paŭlo Ebermann,

4

Per Ubuntu: installa l'ultima versione, questo bug è stato corretto

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

Installa l'ultima versione funzionante (senza patch di sicurezza) senza il bug.

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

Se hai perso quella versione, utilizza la versione precedente a quella:

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

Quindi utilizzare il pinning o fare attenzione a non installare la versione non funzionante.

L'uso -Djdk.net.URLClassPath.disableClassPathURLCheck=truenon ha funzionato per me ovunque avessi messo quella configurazione. Da qualche parte nei miei test di integrazione è sempre uscito senza la vecchia versione di Java.

Come menzionato da Erich è un bug nel pacchetto Debian che è troppo rigido 911925 e il plugin Surefire non funziona secondo le nuove regole SUREFIRE-1588 .


Perché qualcuno dovrebbe suggerire di installare una versione senza patch di sicurezza ?! Anche se altri suggerimenti includono saltare i test, eh.
berezovskyi,

1
Non è più necessario :-) È stato risolto. Ma nel frattempo ho avuto molti progetti Java su cui ho dovuto lavorare e il mio runtime java non è stato esposto in alcun modo a nessun nuovo codice dall'esterno. Quindi c'era un rischio sovrintendibile che andava bene per me. Dopo tutto, è una decisione di tutti :-)
flob

In realtà hai ragione, ho scoperto che gli sviluppatori JDK sono tornati su quel set di scena di default: hg.openjdk.java.net/jdk/jdk/rev/f54dcfc5a5f8 ; ma l'aggiornamento della versione principale a surefire non sembra la soluzione migliore per me, in realtà.
berezovskyi,

1
Assolutamente! Ma i cambiamenti che hanno dovuto apportare sono in tutto il codice base e molto invasivi. Quindi una modifica di versione minore per questa correzione non sarebbe un'opzione in infallibile.
flob

1
E sfortunatamente, la 2.x è fuori produzione e dovremo fare un cambio prima che poi: issues.apache.org/jira/browse/…
berezovskyi,

2

Ho aggiunto dipendenza al motore junit-jupiter e ha funzionato.

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

Quale magia nera fa questo plugin di Giove? Questo ha funzionato per me! Upvote! :-)
Hinotori il

1

Di recente ho impostato il lavoro di maven su Jenkins e sono rimasto bloccato nello stesso problema. Ho preso il suggerimento di modificare la variabile env JAVA e confermare il problema risolto. Ecco come ho testato.

Diventa utente "jenkins" e cambia la cartella con il nome del progetto dell'area di lavoro che hai impostato per il lavoro.

 $ _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"

1

Aggiungendo questo al plugin maven-surefire ho risolto il problema:

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

1

Fondamentalmente è un'incompatibilità tra la versione JDK e la versione del plugin maven-surefire, nel mio caso, JDK 11.0.5 non funziona con surefire 3.0.0-M4, ho dovuto passare a 3.0.0-M3 e ha funzionato. l'impostazione di forkCount su 0 non risolve il problema perché interrompe il report Jacoco.


0

Ho disinstallato il JDK presente nei repository:

$ sudo apt purge openjdk-8-jdk

$ sudo apt autoremove

Quindi ho eliminato la JAVA_HOMEvariabile di ambiente. Il mio era ambientato nel mio .bashrc.

Quindi l'ho reinstallato tramite SDKMAN:

$ sdk install java 8.0.181-zulu

Dal loro sito :

SDKMAN! è uno strumento per la gestione di versioni parallele di più kit di sviluppo software sulla maggior parte dei sistemi basati su Unix. Fornisce una comoda Command Line Interface (CLI) e API per l'installazione, la commutazione, la rimozione e l'elenco dei candidati.

Per vedere altre versioni di JDK da installare, utilizzare:

$ sdk list java

0

Stavo affrontando lo stesso problema con gitlab ci, cambiare l'immagine maven da maven:3-jdk-8a maven:3.6.0-jdk-8-alpinesembra risolvere il problema. Tra l'altro ho anche provato con maven:3.6.0-jdk-8ma non ha funzionato neanche.


0

E 'ancora un problema per surefire - v2.22.2con maven:3.6-jdk-8-alpine. Per risolvere il problema, aggiungi il codice seguente a pom.xml(come plugin maven)

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

-1

Se come me hai problemi nella tua pipeline (per me è in GitLab, ma comunque) e se stai usando un'immagine Docker Maven JDK 8.

È possibile sostituire

image: maven:3.5.4-jdk-8

dall'ultima build funzionante

image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b

1
Il problema deriva dall'ultimo jdk8 per debian, a mio avviso è meglio "risolvere" il problema principale piuttosto che cercare di aggirare il problema.
Sylordis,

Lo sha256 sembra complicato e ti ha spaventato? In realtà un'altra risposta sembra più una soluzione, disabilita alcune funzionalità di surefire, qui si tratta solo di utilizzare l'ultima immagine docker funzionante senza cambiare il pom o la pipeline di lavoro che è un problema.
amdev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.