Maven pasti tidak bisa menemukan kelas ForkedBooter


217

Baru-baru ini datang ke proyek baru, saya mencoba untuk mengkompilasi kode sumber kami. Semuanya bekerja dengan baik kemarin, tetapi hari ini adalah cerita lain.

Setiap kali saya menjalankan mvn clean installmodul, setelah mencapai tes, itu menabrak kesalahan:

[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

dan selanjutnya:

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

Saya menggunakan Debian 9 (Stretch) 64-bit dengan OpenJDK 1.8.0_181, Maven 3.5.4, bekerja di belakang proksi perusahaan saya yang saya konfigurasi di komputer saya ~/.m2/settings.xml.

Suatu hal yang aneh bahwa versi Surefire terbaru adalah 2.22.1 jika saya ingat dengan benar. Saya mencoba menentukan versi plugin, tetapi tidak diperbarui, jika tidak, tidak ada spesifikasi versi plugin dalam POM (orang tua, kakek-nenek atau yang ini).

Saya berhasil memaksa Maven untuk mengubah versi Surefire ke yang terbaru, tetapi sekarang lebih buruk lagi:

[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
Saya mengalami bug ini di clircle-ci. Garpu ayal dan forked vm mencetak pesan berikut dan keluar: "Kesalahan: Tidak dapat menemukan atau memuat kelas utama org.apache.maven.surefire.booter.ForkedBooter". Pijat ada di target / surefire-reports / *. Dumpstream. Jika Anda menjalankan pakar dengan -X ia mencetak baris perintah, Anda dapat mencobanya dan melihat vm mencetak pesan ini.
Bruno Coutinho


solusi saya adalah berhenti menggunakan open-jdks dari versi apa pun. tidak dapat membeli jenis tidak dapat diandalkan ini dalam sesuatu yang begitu mendasar.
Adrian M.

Gunakan dependencyManagementbagian pakar untuk menentukan versi berbeda dari plugin
jogaco

Memperbarui ke jdk 11 di Debian adalah solusi pasti bagi saya!
clearlight

Jawaban:


251

Untuk memperbaikinya (pada 2018), perbarui openjdk Anda ke versi terbaru, setidaknya 8u191-b12. Jika masalah ini muncul kembali pada tahun 2020, kemungkinan perilaku default openjdk telah berubah, dan Anda kemudian perlu memperbarui plugin maven surefire.

Ini adalah bug yang sekarang diperbaiki dalam paket openjdk-8 (perilaku menyimpang dari hulu secara signifikan tanpa perlu; melewatkan patch hulu untuk kembali ke menonaktifkan pemeriksaan keamanan) yang baru saja Anda tingkatkan. Tetapi juga sebuah bug dalam jitu Plugin, ayal-1588 , seharusnya tetap di jitu 3.0.0-M1 : itu tampaknya menggunakan path absolut di tempat di mana Java akan di masa depan hanya memungkinkan nama path relatif (dan Debian mengaktifkan perilaku masa depan sudah).

Versi paket 8u181-b13-2 menyatakan:

  • Terapkan tambalan dari pembaruan keamanan 8u191-b12.

Perhatikan bahwa 191-b12! = 181-b13. Patch keamanan 191-b12 baru saja keluar beberapa hari yang lalu, dan tampaknya pengelola ingin membuat Anda cepat. Memutakhirkan sepenuhnya ke 191-b12 kemungkinan akan membutuhkan pengujian tambahan (ya, tampaknya unggahan ini seharusnya sudah tersedia).

Ada beberapa workaounds:

  1. Anda dapat menginstal paket sebelumnya dari snapshots.do sebagai gantinya. Setelah menurunkan versi, Anda dapat melarang versi yang rusak (jika Anda menggunakan aptitude dan tidak apt) menggunakan sudo aptitude forbid-version openjdk-8-jre-headless. Untuk "apt" reguler, saya tidak melihat mekanisme larangan serupa, jadi Anda mungkin perlu menggunakan apt pinning untuk mencegah pemutakhiran ini diinstal ulang (atau Anda hanya perlu menurunkan versi lagi, saya harap ini akan segera teratasi).
  2. Menurut pelacakan bug, pengaturan properti -Djdk.net.URLClassPath.disableClassPathURLCheck=truedengan metode biasa (misalnya, JAVA_FLAGS) juga harus membantu. Tapi saya belum memverifikasi ini sendiri. Anda bahkan dapat menambahkan solusi untuk~/.m2/settings.xml mengaktifkannya untuk semua build Maven Anda dengan mudah.

Seperti yang Anda lihat, pelacakan bug berfungsi , masalahnya dipersempit, dan paket tetap tersedia dan versi baru dari plugin jitu akan segera hadir!


@AdrianMadaras Saya tidak mendapatkan pembaruan baru sejauh ini, hanya versi -2. Belum ada pengumuman unggahan tetap, tetapi sedang berlangsung. Anda mungkin baru saja memperbarui ke versi bermasalah yang diketahui.
Erich Schubert

1
Saya baru saja mendapatkan masalah yang sama pada Ubuntu 18.04, menggunakan OpenJDK 10.0.2. Mengalihkan JAVA_HOME ke instal 'java-9-oracle' saya memperbaikinya.
RobAu

2
Berikut adalah masalah terkait dalam pelacak isu mfire -plugin- surefire : issues.apache.org/jira/browse/SUREFIRE-1588 (itu masih bug di backport Canonical / Debian dari perubahan OpenJDK yang relevan).
mirabilos

1
Mengatasi masalah 1. tidak masuk akal bagi saya karena itulah versi masalah yang saya alami. Meng-override maven-surefire-plugin untuk tidak menggunakan SystemClassLoader juga tidak berfungsi
Edwin Diaz-Mendez

1
Anda dapat mencoba meningkatkan ke ayal 3.0.0-M1 juga. Tapi versi 2 hingga 3 tonggak tentu saja dapat memecahkan hal-hal lain.
Erich Schubert

54

Setel useSystemClassloader ke false:

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

Jika Anda tidak mewarisi dari orangtua yang memiliki versi yang ditentukan untuk Anda (seperti starter Spring Boot), Anda juga harus mendefinisikannya.


Mengaktifkan classloader sistem adalah praktik terburuk karena Anda menjalankan tes dalam proses plugin. Praktik yang tepat adalah meningkatkan versi setiap plugin. Maven 3.7.0 akan memutakhirkan versi semua plugin yang termasuk dalam siklus hidup default. Musim semi tidak boleh menempel pada versi lama dan tidak boleh menimpanya juga. Ini menyebabkan konflik dalam tanggung jawab yang tidak perlu.
tibor17

52

Saya menemukan solusi ini dan memperbaiki pengujian saya: konfigurasikan maven-surefire-pluginuntuk tidak menggunakan classloader sistem.


Menurut pengelola maven-surefire-plugin, semua solusi (ini, pengaturan forkCountke 0, atau pengaturan argLinesecara global) memiliki masalah dan tidak dapat diterapkan secara universal.
mirabilos

Bagus temukan. Tapi tolong sertakan teks solusi aktual dalam posting Anda, atau setidaknya identifikasi tautan dengan jelas sebagai tautan stackoverflow. Yaitu pendekatan yang digunakan oleh @markoorn lebih bermanfaat.
nealmcb

38

Saya punya solusi lain. Setel variabel lingkungan _JAVA_OPTIONS. Saya telah menggunakan ini untuk agen build TeamCity kami dan sekarang build kami berjalan dengan baik.

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

Perubahan yang dilabeli sebagai perbaikan keamanan biasanya tidak diperkenalkan tanpa alasan dan sehingga seseorang memberi tahu SO cara menonaktifkannya ... katakan saja '
berezovskyi

26

Saya memposting varian yang lebih bertarget dari salah satu solusi di atas di JIRA . Tambahkan ke ~/.m2/settings.xml:

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

Ini gagal dengan peringatan berikut:[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 Cuplikan di atas harus disertakan <settings><profiles>...</profiles></settings>.
qqx

13

Saya mengalami masalah ini di build GitLab CI saya, yang menggunakan maven:3.5.4-jdk-8gambar Docker.

Mengubahnya untuk maven:3.5.4-jdk-8-alpinememperbaiki masalah.



8

Saat menggunakan GitLab CI / CD dengan 3.6.0-jdk-8gambar hanya properti di bawah ini yang membantu (tanpa memodifikasi pom.xml).

-Dsurefire.useSystemClassLoader=false

Lagi-lagi ini adalah praktik buruk. Yang benar adalah meningkatkan versi. Selalu periksa versi di Maven Central .
tibor17

5

Bagi mereka yang mencari jawaban yang terkait dengan Docker Maven: 3.5.x-jdk-8 di GitLab CI, lihat masalah GitHub ini .

Tampaknya 3.5.4-jdk-8gambar menghasilkan peningkatan ke versi Java kecil yang entah bagaimana mempengaruhi mekanisme forking Surefire.

Bergulir kembali ke 3.5.3-jdk-8gambar memperbaiki ini untuk saya di server GitLab CI saya membangun kode Java 1.8 dengan Surefire 2.20.1.


5

Saran di atas untuk mengatur properti "-Djdk.net.URLClassPath.disableClassPathURLCheck = true" TIDAK bekerja untuk saya, tetapi pengaturan berikut ini tidak berfungsi OK:

-DforkCount=0

2
Ini memiliki efek tidak menciptakan VM baru untuk menjalankan tes, sehingga tes mungkin dapat mempengaruhi VM build utama.
Paŭlo Ebermann

4

Untuk Ubuntu: Instal versi terbaru, bug ini diperbaiki

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

Instal versi kerja terakhir (tanpa tambalan keamanan) tanpa 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

Jika Anda melewatkan versi itu, gunakan versi sebelumnya:

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

Kemudian gunakan penjepit atau hati-hati agar Anda tidak menginstal versi yang rusak.

Menggunakan -Djdk.net.URLClassPath.disableClassPathURLCheck=truetidak berfungsi untuk saya di mana pun saya meletakkan konfigurasi itu. Di suatu tempat dalam tes integrasi saya selalu keluar tanpa versi Java lama.

Seperti disebutkan oleh Erich itu adalah bug dalam paket Debian yang terlalu ketat 911925 dan plugin Surefire tidak bertindak sesuai dengan aturan baru SUREFIRE-1588 .


Mengapa ada yang menyarankan untuk menginstal versi tanpa patch keamanan ?! Meskipun saran lain termasuk tes skipping, ya.
berezovskyi

1
Anda tidak perlu lagi :-) Sudah diperbaiki. Tetapi untuk sementara itu saya punya banyak proyek java yang harus saya kerjakan dan java runtime saya tidak ditemukan di mana pun kode baru dari luar. Jadi ada risiko yang bisa diawasi, itu baik bagi saya. Bagaimanapun juga, ini adalah keputusan semua orang :-)
flob

Sebenarnya Anda benar, saya menemukan bahwa JDK devs berjalan kembali di prop yang ditetapkan secara default: hg.openjdk.java.net/jdk/jdk/rev/f54dcfc5a5f8 ; tetapi peningkatan versi utama ke yang pasti tidak tampak seperti perbaikan terbaik bagi saya, sebenarnya.
berezovskyi

1
Benar! Tetapi perubahan yang harus mereka lakukan adalah seluruh basis kode dan sangat invasif. Jadi perubahan versi kecil untuk perbaikan ini tidak akan menjadi opsi di jitu.
flob

1
Dan sayangnya, 2.x dihentikan dan kita harus melakukan pergantian lebih cepat daripada nanti: issues.apache.org/jira/browse/…
berezovskyi

2

Saya telah menambahkan ketergantungan pada mesin junit-jupiter, dan itu berhasil.

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

Apa sihir hitam yang dilakukan plugin jupiter-plugin ini? Ini berhasil untuk saya! Suara positif! :-)
Hinotori

1

Saya baru-baru ini mengatur pekerjaan pakar pada Jenkins dan terjebak dalam masalah yang sama. Saya mengambil saran untuk memodifikasi variabel env JAVA dan mengkonfirmasi masalah terselesaikan. Beginilah cara saya menguji.

Menjadi "jenkins" pengguna dan mengubah folder untuk nama proyek workspace yang Anda siapkan untuk pekerjaan itu.

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

Menambahkan ini ke plugin maven-surefire-plugin saya memecahkan masalah:

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

1

Pada dasarnya adalah ketidakcocokan antara versi JDK dan versi plugin maven-surefire, dalam kasus saya, JDK 11.0.5 tidak bekerja dengan ayal 3.0.0-M4, saya harus beralih ke 3.0.0-M3 dan berhasil. menetapkan forkCount ke 0 tidak memperbaiki masalah karena merusak laporan Jacoco.


0

Saya mencopot JDK yang disertakan dalam repositori:

$ sudo apt purge openjdk-8-jdk

$ sudo apt autoremove

Kemudian saya menghapus JAVA_HOMEvariabel lingkungan. Milik saya diatur dalam .bashrc saya.

Lalu saya menginstal ulang melalui SDKMAN:

$ sdk install java 8.0.181-zulu

Dari situs mereka :

SDKMAN! adalah alat untuk mengelola versi paralel beberapa Kit Pengembangan Perangkat Lunak pada sebagian besar sistem berbasis Unix. Ini menyediakan Command Line Interface (CLI) dan API yang nyaman untuk menginstal, mengalihkan, menghapus, dan mendaftarkan Calon.

Untuk melihat versi JDK lainnya untuk diinstal, gunakan:

$ sdk list java

0

Saya menghadapi masalah yang sama dengan gitlab ci, mengubah gambar pakar dari maven:3-jdk-8menjadi maven:3.6.0-jdk-8-alpineuntuk memperbaiki masalah. Btw saya juga diuji dengan maven:3.6.0-jdk-8tetapi tidak berhasil juga.


0

Ini masih menjadi masalah bagi surefire - v2.22.2dengan maven:3.6-jdk-8-alpine. Untuk memperbaiki masalah ini, tambahkan kode di bawah ini ke pom.xml(sebagai plugin pakar)

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

-1

Jika seperti saya, Anda memiliki masalah dalam saluran pipa Anda (bagi saya itu ada di GitLab, tapi apa pun) dan jika Anda menggunakan gambar Docker Maven JDK 8.

Anda bisa mengganti

image: maven:3.5.4-jdk-8

oleh build kerja terakhir

image: maven@sha256:b37da91062d450f3c11c619187f0207bbb497fc89d265a46bbc6dc5f17c02a2b

1
Masalahnya berasal dari jdk8 terbaru untuk debian, Menurut saya lebih baik untuk "memperbaiki" masalah inti daripada mencoba untuk mengatasinya.
Sylordis

Sha256 terdengar rumit dan membuatmu takut? Sebenarnya jawaban lain lebih terlihat seperti bekerja di sekitar, menonaktifkan beberapa fitur dari jitu, di sini ini hanya tentang menggunakan gambar buruh pelabuhan yang terakhir bekerja tanpa mengubah pom atau pipa kerja Anda yang merupakan pekerjaan di sekitar.
amdev
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.