Program java saya dikemas dalam file jar dan memanfaatkan perpustakaan jar eksternal, goyang kastil . Kode saya mengkompilasi dengan baik, tetapi menjalankan toples mengarah ke kesalahan berikut:
Pengecualian di utas "utama" java.lang.SecurityException: Intisari file tanda tangan tidak valid untuk atribut utama Manifest
Saya telah mencari di Google selama lebih dari satu jam untuk mencari penjelasan dan menemukan sangat sedikit nilainya. Jika ada yang melihat kesalahan ini sebelumnya dan dapat menawarkan bantuan, saya wajib.
Jawaban:
Solusi yang tercantum di sini mungkin menyediakan pointer.
Intinya:
sumber
Bagi mereka yang mendapat kesalahan ini ketika mencoba untuk membuat uber-jar dengan
maven-shade-plugin
, solusinya adalah untuk mengecualikan file tanda tangan manifest dengan menambahkan baris berikut ke konfigurasi Plugin:sumber
Bagi mereka yang menggunakan gradle dan mencoba membuat dan menggunakan guci lemak, sintaksis berikut mungkin membantu.
sumber
exclude
untukfatJar
tugas saya , yang memilikiconfigurations.compile.collect
perintah itu. Lihat stackoverflow.com/a/31426413/103412Error: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
Beberapa dependensi Anda kemungkinan adalah jarfiles yang ditandatangani. Ketika Anda menggabungkan semuanya menjadi satu file jar besar, file tanda tangan yang sesuai masih ada, dan tidak lagi cocok dengan jarfile "gabungan besar", sehingga runtime berhenti berpikir file jar telah dirusak (yang ... harus berbicara).
Anda dapat memecahkan masalah dengan menghilangkan file tanda tangan dari dependensi jarfile Anda. Sayangnya, ini tidak mungkin dilakukan dalam satu langkah di semut .
Namun, saya bisa mendapatkan ini berfungsi dengan Ant dalam dua langkah, tanpa secara khusus menyebutkan setiap dependensi jarfile, dengan menggunakan:
Elemen tidur seharusnya mencegah kesalahan tentang file dengan tanggal modifikasi di masa mendatang .
Variasi lain yang saya temukan di utas tertaut tidak berfungsi untuk saya.
sumber
Silakan gunakan perintah berikut
sumber
Saya mengalami masalah ini saat menggunakan IntelliJ IDEA 14.01.
Saya dapat memperbaikinya dengan:
File-> Struktur Proyek-> Tambah Baru (Artefak) -> jar-> Dari Modul Dengan Ketergantungan pada Buat Jar Dari Jendela Modul:
Pilih kelas utama Anda
File JAR dari Perpustakaan Pilih salin ke direktori output dan tautan melalui manifes
sumber
Keamanan sudah menjadi topik yang sulit, tetapi saya kecewa melihat solusi paling populer adalah menghapus tanda tangan keamanan. JCE membutuhkan tanda tangan ini . Naungan naungan meledak file jar BouncyCastle yang menempatkan tanda tangan ke META-INF, tetapi tanda tangan BouncyCastle tidak berlaku untuk jar, uber-jar baru (hanya untuk tabung BC), dan itulah yang menyebabkan kesalahan tanda tangan tidak valid di utas ini. .
Ya, mengecualikan atau menghapus tanda tangan seperti yang disarankan oleh @ruhsuzbaykus memang membuat kesalahan asli hilang, tetapi juga dapat menyebabkan kesalahan baru dan samar:
Dengan secara eksplisit menentukan di mana menemukan algoritma seperti ini:
Saya bisa mendapatkan kesalahan yang berbeda:
JCE tidak dapat mengautentikasi penyedia karena kami telah menghapus tanda tangan kriptografi dengan mengikuti saran di tempat lain di utas yang sama ini .
Solusi yang saya temukan adalah plugin packer yang dapat dieksekusi yang menggunakan pendekatan toples-to-jar untuk mempertahankan tanda tangan BouncyCastle dalam satu stoples yang dapat dieksekusi.
PEMBARUAN :
Cara lain untuk melakukan ini (cara yang benar?) Adalah dengan menggunakan penanda Maven Jar . Ini memungkinkan Anda untuk tetap menggunakan naungan Maven tanpa mendapatkan kesalahan keamanan. NAMUN, Anda harus memiliki sertifikat penandatanganan kode (Oracle menyarankan untuk mencari "Java Signing Certificate"). Konfigurasi POM terlihat seperti ini:
Tidak, tidak ada cara untuk membuat JCE mengenali sertifikat yang ditandatangani sendiri, jadi jika Anda perlu mempertahankan sertifikat BouncyCastle, Anda harus menggunakan plugin jar-in-jar atau mendapatkan sertifikat JCE.
sumber
Saya menghadapi masalah yang sama, setelah referensi di suatu tempat, itu berfungsi sebagai berikut:
sumber
maven-shade-plugin
tag.Dengan asumsi Anda membuat file jar Anda dengan semut, Anda bisa menginstruksikan semut untuk meninggalkan direktori META-INF. Ini adalah versi sederhana dari target semut saya:
sumber
Saya baru-baru ini mulai menggunakan IntelliJ pada proyek saya. Namun, beberapa rekan saya masih menggunakan Eclipse di proyek yang sama. Hari ini, saya mendapatkan kesalahan yang sama setelah menjalankan file jar yang dibuat oleh IntelliJ saya. Sementara semua solusi di sini berbicara tentang hal yang hampir sama, tidak ada satupun yang bekerja untuk saya dengan mudah (mungkin karena saya tidak menggunakan ANT, maven build memberi saya kesalahan lain yang merujuk saya ke http://cwiki.apache.org/ confluence / display / MAVEN / MojoExecutionException , dan saya juga tidak bisa mencari tahu apa toples yang ditandatangani sendiri!)
Akhirnya, ini membantu saya
Coba tebak apa yang telah dihapus dari file jar saya ?!
Tampaknya masalah ini relevan dengan beberapa file yang terkait dengan gerhana.
sumber
Saya memiliki masalah yang sama
gradle
ketika membuat Jar gemuk, memperbaruibuild.gradle
file dengan baris yang dikecualikan memperbaiki masalah.sumber
Jika Anda menggunakan gradle, inilah tugas farJar lengkap:
sumber
Bandingkan folder META-INF dalam tabung baru dengan tabung lama (sebelum Anda menambahkan perpustakaan baru). Kemungkinan akan ada file baru. Jika ya, Anda dapat menghapusnya. Itu seharusnya membantu. Salam, 999 Michael
sumber
Sebuah strategi akan terdiri dalam menggunakan ANT untuk menyederhanakan penghapusan tanda tangan dari setiap file Jar. Itu akan melanjutkan dengan langkah-langkah berikut:
Ini adalah ANT macrodef yang melakukan pekerjaan:
`
Definisi kemudian dapat dipanggil dengan cara ini dalam tugas ANT:
sumber
Apa yang membantu saya (IntelliJ IDEA 2016.3): File -> Struktur Proyek -> Artefak -> Tambah JAR -> Pilih Kelas Utama -> Pilih "salin ke direktori keluaran dan tautan melalui manifes" -> OK -> Terapkan -> Bangun - > Bangun Artefak ... -> Bangun
sumber
Mungkin saja dua penandatangan yang berbeda mengacaukan pikiran java.
Coba hapus folder META-INF dari tabung, tambahkan manifes dan tanda tangan JAR lagi, itu membantu saya: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- atribut /
sumber
Jika Anda mencari solusi Fat JAR tanpa membongkar atau merusak perpustakaan asli tetapi dengan classloader JAR khusus, lihat proyek saya di sini .
Penafian: Saya tidak menulis kode, cukup bungkus dan publikasikan di Maven Central dan jelaskan pada saya bagaimana cara menggunakannya.
Saya pribadi menggunakannya untuk membuat JAR uber yang dapat dijalankan yang berisi dependensi BouncyCastle. Mungkin ini berguna untuk Anda juga.
sumber
Bagi mereka yang memiliki masalah dengan solusi yang diterima, ada cara lain untuk mengecualikan sumber daya dari tabung teduh dengan DontIncludeResourceTransformer:
https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer
Dari Shade 3.0, transformator ini menerima daftar sumber daya. Sebelum itu Anda hanya perlu menggunakan beberapa transformator masing-masing dengan satu sumber daya.
sumber
Ini terjadi pada saya di Intellij ketika saya mengklik "Tambahkan sebagai Proyek Maven" di baris bawah ketika Intellij mengatakan "file pom yang tidak dikelola ditemukan.". Sementara itu folder keluar sudah dibuat. Jadi itu tidak mendapatkan perubahan terbaru.
Menghapus folder dan menjalankan program memecahkan masalah untuk saya. folder keluar kemudian dibuat kembali.
Lihat jawaban Little Fox juga. Kesalahan yang saya terima sangat mirip dengan kesalahannya.
sumber
Saya punya masalah serupa. Alasannya adalah bahwa saya mengkompilasi menggunakan JDK dengan JRE berbeda dari yang default di kotak Windows saya.
Menggunakan java.exe yang benar memecahkan masalah saya.
sumber
Jika Anda mendapatkan ini ketika mencoba untuk mengikat file JAR untuk proyek pengikatan Xamarin.Android seperti:
Cukup buka file JAR menggunakan Winzip dan hapus direktori meta-inf. Membangun kembali - pekerjaan selesai
sumber