“File tanda tangan tidak valid” ketika mencoba menjalankan .jar

450

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.


sumber
1
apakah Anda mencoba menandatangani toples Anda sendiri? jika demikian, bagaimana Anda mencoba menandatanganinya?
Cogsy
Tidak, setidaknya saya tidak berpikir begitu. Xcode mungkin mencoba untuk menandatanganinya sendiri, tetapi tampaknya tidak ada pengaturan untuk mematikannya.
jangan lupa untuk memeriksa apakah botol yang berisi antarmuka yang diimplementasikan juga ditandatangani!
gaurav

Jawaban:

47

Solusi yang tercantum di sini mungkin menyediakan pointer.

Intisari file tanda tangan tidak valid untuk atribut utama Manifest

Intinya:

Mungkin yang terbaik untuk menyimpan toples resmi apa adanya dan hanya menambahkannya sebagai ketergantungan pada file manifes untuk file toples aplikasi Anda.

Nrj
sumber
3
Bagaimana saya merefleksikan ini dalam file manifes? Saya belum pernah mengedit satu sebelumnya. Saya menggunakan Xcode, dan konvensi umum adalah untuk menempatkan pustaka jar eksternal di direktori myproject / lib untuk dimasukkan, yang adalah apa yang saya lakukan.
@ user123003 .. seperti halnya dengan Intelli-J
MikeM
13
Sayangnya beberapa dari kita menggunakan hal-hal seperti "plugin maven shade" sehingga memasukkan salinan kata demi kata dari tabung asli tidak semudah itu ...
rogerdpack
plug tak tahu malu untuk menjawab di situs ini : stackoverflow.com/a/30922181/448779
foo
bagaimana dengan maven-assembly-plugin? Ini menyelesaikan masalah ini dalam kasus saya
jhenya-d
1083

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:

<configuration>
    <filters>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
            </excludes>
        </filter>
    </filters>
    <!-- Additional configuration. -->
</configuration>
ruhsuzbaykus
sumber
9
Saya menggunakan metode ini untuk jar-uber saya, dan itu berhasil dengan baik. Ada contoh POM lengkap di maven.apache.org/plugins/maven-shade-plugin/examples/… yang menunjukkan metode ini memfilter file yang disertakan.
M. Dudley
4
Saya tergoda untuk memulai utas yang sama sekali baru - tetapi karena ini adalah nomor 1 dalam hasil Googles - sepertinya tepat untuk menyimpannya di sini. Baris yang tercantum di sini ada dalam file POM yang saya gunakan - dan saya masih mendapatkan kesalahan keamanan saat menjalankan aplikasi. Itu membangun dengan baik - dan tentu saja berjalan dengan baik ketika TIDAK melakukan toples - seperti yang diharapkan. Dan sementara itu tentu saja pilihan - pisahkan mereka - itu tidak menyelesaikan masalah jika Anda menginginkan Jar Uber.
Gavin Baumanis
7
Ini bekerja untuk saya tapi ... mengapa kita harus mengabaikan file tanda tangan? Saya yakin manifes tanda tangan ada di sana karena suatu alasan ....
Jeryl Cook
4
Pastikan untuk melakukan "mvn clean" setelah melakukan hal di atas!
codeinjuice
4
@JerylCook File tanda tangan ada untuk menunjukkan bahwa isi dari toples ini memiliki file-file ini. Saat Anda membuat toples uber, Anda menambahkan banyak file ke toples, dan karenanya tanda tangannya tidak benar. Jika Anda benar-benar ingin, Anda bisa menandatangani ulang toples baru, tetapi tentu saja itu dengan tanda tangan Anda, bukan yang lama. Atau, Anda tidak bisa mendistribusikan toples uber, tetapi sebaliknya memasukkan toples yang ditandatangani sebagai file terpisah, tetapi kemudian hal itu mengalahkan tujuan toples uber.
LadyCailin
139

Bagi mereka yang menggunakan gradle dan mencoba membuat dan menggunakan guci lemak, sintaksis berikut mungkin membantu.

jar {
    doFirst {
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' 
}
Keith P
sumber
1
Ini pada dasarnya mengecualikan semua file dengan ekstensi .RSA, .SF, atau .DSA di dalam direktori META-INF.
Keith P
9
Menandatangani file jar menambahkan file-file ini di bawah META-INF, tetapi ketika mereka dimasukkan, tanda tangan tidak lagi setuju dengan konten jar. Dengan demikian menghapusnya menghindari ketidakcocokan tanda tangan.
Peter N. Steinmetz
1
Ada pertanyaan serupa tentang penggunaan guci gemuk secara bertahap - stackoverflow.com/questions/4871656/…
Tomasz Sętkowski
3
Ini tidak berhasil untuk saya. Saya harus meletakkan excludeuntuk fatJartugas saya , yang memiliki configurations.compile.collectperintah itu. Lihat stackoverflow.com/a/31426413/103412
Torsten
1
Ini juga memecahkan kesalahanError: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
vonox7
57

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:

<target name="jar" depends="compile" description="Create one big jarfile.">
    <jar jarfile="${output.dir}/deps.jar">
        <zipgroupfileset dir="jars">
            <include name="**/*.jar" />
        </zipgroupfileset>
    </jar>
    <sleep seconds="1" />
    <jar jarfile="${output.dir}/myjar.jar" basedir="${classes.dir}">
        <zipfileset src="${output.dir}/deps.jar" excludes="META-INF/*.SF" />
        <manifest>
            <attribute name="Main-Class" value="com.mycompany.MyMain" />
        </manifest>
    </jar>
</target>

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.

Apodaca kaya
sumber
Dimungkinkan untuk dilakukan dalam satu langkah, menggunakan cara berbeda untuk menentukan botol Anda: <jar destfile = "build / myjar.jar"> <restrict> <not> <name name = "META-INF / *. SF" /> </not> <archives> <zips> <fileset dir = "jarfolder" meliputi = " * / .jar" /> </zips> </archives> </restrict> </jar>
DieterDP
57

Silakan gunakan perintah berikut

zip -d yourjar.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF'
Peter2711
sumber
4
Terima kasih, saya punya masalah dengan intellij 14 dan solusi Anda berfungsi untuk saya!
Mohamad Kouhi Moghadam
5
Terima kasih, bekerja untuk saya di Windows. Baru saja membuka toples dengan 7zip, menghapus file .SF. Saya tidak punya file .RSA untuk dihapus
candino
3
Wow, dapatkah saya mengatakan solusi ini luar biasa (dan saya belajar sesuatu yang sangat kuat di sepanjang jalan!) Ini perlu lebih upvoting.
Dylan_Larkin
Saya setuju dengan komentar @Dylan_Larkin, ini yang menyelesaikannya untuk saya.
Felipe Valdes
26

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

Travis
sumber
2
Apakah mungkin untuk memasukkan toples tergantung ke dalam toples target?
coder.chenzhi
solusi Anda berfungsi dengan baik !! terimakasih banyak!
hzitoun
19

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:

java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available

Dengan secara eksplisit menentukan di mana menemukan algoritma seperti ini:

SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");

Saya bisa mendapatkan kesalahan yang berbeda:

java.security.NoSuchProviderException: JCE cannot authenticate the provider BC

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:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <filters>
                    <filter>
                        <artifact>org.bouncycastle:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>your.class.here</mainClass>
                    </transformer>
                </transformers>
                <shadedArtifactAttached>true</shadedArtifactAttached>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jarsigner-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <id>sign</id>
            <goals>
                <goal>sign</goal>
            </goals>
        </execution>
        <execution>
            <id>verify</id>
            <goals>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <keystore>/path/to/myKeystore</keystore>
        <alias>myfirstkey</alias>
        <storepass>111111</storepass>
        <keypass>111111</keypass>
    </configuration>
</plugin>

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.

MattW
sumber
Ini jelas cara yang tepat untuk melakukannya, bahkan jika itu pekerjaan yang intensif. Terima kasih telah menunjukkan, secara rinci, peringatan dengan menggunakan jawaban yang disetujui. Apakah Anda tahu jika sertifikat JCE harus ditandatangani oleh Sun? Atau bisa
WiteCastle
1
Ada pihak ketiga yang dapat menerbitkan sertifikat penandatanganan kode. Cari "Sertifikat Penandatanganan Kode Java" untuk melihat opsi.
MattW
Anda, tuan, membuat hari saya!
socona
Membantu saya. Ada beberapa file di perpustakaan ini, yang tidak saya gunakan, jadi kecuali mereka membantu saya dengan file
gendut
14

Saya menghadapi masalah yang sama, setelah referensi di suatu tempat, itu berfungsi sebagai berikut:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>
m.nguyencntt
sumber
1
Ini memecahkan masalah saya dengan cepat! Untuk kelengkapan, ini harus masuk dalam maven-shade-plugintag.
Kuzeko
1
@Kuzeko Memperbarui anwser dengan saran Anda. Terima kasih
m.nguyencntt
8

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:

<jar destfile="app.jar" basedir="${classes.dir}">
    <zipfileset excludes="META-INF/**/*" src="${lib.dir}/bcprov-jdk16-145.jar"></zipfileset>
    <manifest>
        <attribute name="Main-Class" value="app.Main"/>
    </manifest>
</jar>
Kim Stebel
sumber
di mana saya harus menambahkan baris ini?
Addi.Star
4

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

zip -d demoSampler.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF'

Coba tebak apa yang telah dihapus dari file jar saya ?!

deleting: META-INF/ECLIPSE_.SF 
deleting: META-INF/ECLIPSE_.RSA

Tampaknya masalah ini relevan dengan beberapa file yang terkait dengan gerhana.

mhn_namak
sumber
4

Saya memiliki masalah yang sama gradleketika membuat Jar gemuk, memperbarui build.gradlefile dengan baris yang dikecualikan memperbaiki masalah.

jar {
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
    manifest {
        attributes 'Main-Class': 'com.test.Main'
    }
}
Ahmad Al-Kurdi
sumber
1
Saya debugging selama berhari-hari, ini memecahkan masalah guci saya.
sysuser
Cara saya debugged adalah untuk menempatkan guci lemak di direktori jmeter lib. Jika Anda memiliki stoples bermasalah di lib / ext, masalah ini tidak akan terlihat jelas, alih-alih Anda akan mendapatkan kesalahan seperti yang ada di stackoverflow.com/questions/37624187/…
sysuser
1
kecualikan 'META-INF / *. RSA', 'META-INF / *. SF', 'META-INF / *. DSA' Ini hilang, beberapa toples yang menyebabkan masalah
Nirbhay Mishra
3

Jika Anda menggunakan gradle, inilah tugas farJar lengkap:

version = '1.0'
//create a single Jar with all dependencies
task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',  
            'Implementation-Version': version,
            'Main-Class': 'com.example.main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' 
    with jar
}
Nick De Greek
sumber
2

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

999 michal
sumber
2

Sebuah strategi akan terdiri dalam menggunakan ANT untuk menyederhanakan penghapusan tanda tangan dari setiap file Jar. Itu akan melanjutkan dengan langkah-langkah berikut:

  1. Menyalin MANIFEST.MF dalam file sementara
  2. Menghapus entri Name dan SHA dari file sementara
  3. Membuat file Jar sementara dengan manifes sementara
  4. Menghapus manifes sementara
  5. Bertukar file Jar asli dengan yang sementara

Ini adalah ANT macrodef yang melakukan pekerjaan:

<macrodef name="unsignjar" description="To unsign a specific Jar file">
    <attribute name="jarfile" 
        description="The jar file to unsign" />
    <sequential>
<!-- Copying to the temporary manifest file -->
        <copy toFile="@{jarFile}_MANIFEST.tmp">
            <resources>
                <zipentry zipfile="@{jarFile}" name="META-INF/MANIFEST.MF"/>
            </resources>
        </copy>
<!-- Removing the Name and SHA entries from the temporary file -->
        <replaceregexp file="@{jarFile}_MANIFEST.tmp" match="\nName:(.+?)\nSH" replace="SH" flags="gis" byline="false"/>
        <replaceregexp file="@{jarFile}_MANIFEST.tmp" match="SHA(.*)" replace="" flags="gis" byline="false"/>
<!-- Creating a temporary Jar file with the temporary manifest -->
        <jar jarfile="@{jarFile}.tmp"
            manifest="@{jarFile}_MANIFEST.tmp">
            <zipfileset src="@{jarFile}">
                <include name="**"/>
                <exclude name="META-INF/*.SF"/>
                <exclude name="META-INF/*.DSA"/>
                <exclude name="META-INF/*.RSA"/>
            </zipfileset>
        </jar>
<!-- Removing the temporary manifest -->
        <delete file="@{jarFile}_MANIFEST.tmp" />
<!-- Swapping the original Jar file with the temporary one -->
        <move file="@{jarFile}.tmp"
              tofile="@{jarFile}"
              overwrite="true" />
</sequential>

`

Definisi kemudian dapat dipanggil dengan cara ini dalam tugas ANT:

<target name="unsignJar">
    <unsignjar jarFile="org.test.myjartounsign.jar" />
</target>
bdulac
sumber
2

Kesalahan: Kesalahan JNI telah terjadi, silakan periksa instalasi Anda dan coba lagi Pengecualian di utas "utama" java.lang.SecurityException: intisari file tanda tangan tidak valid untuk atribut utama Manifest di sun.security.util.SignatureFileVerifier.processImpl (SignatureFileVerifier.java: 314) di sun.security.util.SignatureFileVerifier.process (SignatureFileVerifier.java:68) di java.util.jar.JarVerifier.processEntry (JarVerifier.java:316) di java.util.jar.JarVerifier.update (JarVerifier.java : 228) di java.util.jar.JarFile.initializeVerifier (JarFile.java:383) di java.util.jar.JarFile.getInputStream (JarFile.java:450) di sun.misc.URLClassPath $ JarLoader $ 2.getInputStream (URLClassPath .java: 977) di sun.misc.Resource.cachedInputStream (Resource.java:77) di sun.misc.Resource.getByteBuffer (Resource.java:160) di java.net.URLClassLoader.defineClass (URLClassLoader.java:454) di java.net.URLClassLoader.access $ 100 (URLClassLoader.java:73) di java.net.URLClassLoader $ 1.run (URLClassLoader.java:368) di java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) di java.security.AccessController.doPrivileged (Metode Asli) di java.net.URLClassLoader.findClass (URLClassLoader.java:361) di java.lang.ClassLoaderload (ClassLoader.java:424) di sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) di java.lang.ClassLoader.loadClass (ClassLoader.java:357) di sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper). java: 495)jalankan (URLClassLoader.java:368) di java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) di java.security.AccessController.doPrivileged (Metode Asli) di java.net.URLClassLoader.findClass (URLClassLoader.ja ) di java.lang.ClassLoader.loadClass (ClassLoader.java:424) di sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) di java.lang.ClassLoader.loadClass (ClassLoader.java:357) di sun .launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)jalankan (URLClassLoader.java:368) di java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) di java.security.AccessController.doPrivileged (Metode Asli) di java.net.URLClassLoader.findClass (URLClassLoader.ja ) di java.lang.ClassLoader.loadClass (ClassLoader.java:424) di sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) di java.lang.ClassLoader.loadClass (ClassLoader.java:357) di sun .launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)331) di java.lang.ClassLoader.loadClass (ClassLoader.java:357) di sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)331) di java.lang.ClassLoader.loadClass (ClassLoader.java:357) di sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)

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

Rubah Kecil
sumber
1

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.

Kriegaex
sumber
0

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

          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                <resource>BC1024KE.DSA</resource>
            </transformer>
          </transformers>

Dari Shade 3.0, transformator ini menerima daftar sumber daya. Sebelum itu Anda hanya perlu menggunakan beberapa transformator masing-masing dengan satu sumber daya.

M.Liang
sumber
0

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.

Onat Korucu
sumber
-1

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.

Jus12
sumber
-2

Jika Anda mendapatkan ini ketika mencoba untuk mengikat file JAR untuk proyek pengikatan Xamarin.Android seperti:

JARTOXML: peringatan J2XA006: kesalahan kelas yang hilang dimunculkan saat mencerminkan com.your.class: Intisari file tanda tangan tidak valid untuk atribut utama Manifest

Cukup buka file JAR menggunakan Winzip dan hapus direktori meta-inf. Membangun kembali - pekerjaan selesai

Dean Wild
sumber
1
Ini adalah teknik yang mengerikan. Benar-benar mengerikan. Buat koreksi secara lokal jangan lakukan perubahan pada stoples yang masuk
sinisterrook