Saya telah menginstal aplikasi, ketika saya mencoba menjalankannya (ini adalah jar yang dapat dieksekusi) tidak ada yang terjadi. Ketika saya menjalankannya dari commandline dengan:
java -jar "app.jar"
Saya mendapatkan pesan berikut:
tidak ada atribut manifes utama, di "app.jar"
Biasanya, jika saya membuat program sendiri, saya akan menambahkan atribut kelas utama ke file manifes. Tetapi dalam hal ini, karena file tersebut dari aplikasi, saya tidak bisa melakukan itu. Saya juga mencoba mengekstrak toples untuk melihat apakah saya dapat menemukan kelas utama, tetapi ada banyak kelas dan tidak ada yang memiliki kata "utama" di namanya. Pasti ada cara untuk memperbaikinya karena program berjalan dengan baik pada sistem lain.
javap
. Anda mungkin ingin melepaskannya dan melihat apakah sebenarnya tidak ada manifes.Jawaban:
Pertama, agak aneh, melihat Anda berlari
java -jar "app"
dan tidakjava -jar app.jar
Kedua, untuk membuat toples dapat dieksekusi ... Anda perlu toples file bernama META-INF / MANIFEST.MF
file itu sendiri harus memiliki (setidaknya) liner yang satu ini:
Di mana
com.mypackage.MyClass
kelas memegang public static void main (String [] args) titik masuk .Perhatikan bahwa ada beberapa cara untuk menyelesaikan ini baik dengan CLI, Maven, Ant atau Gradle:
Untuk CLI , perintah berikut akan dilakukan: (tks @ dvvrt )
jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
Untuk Maven , sesuatu seperti cuplikan berikut harusnya membantu. Perhatikan bahwa ini hanya definisi plugin, bukan pom.xml lengkap :
(Pilih a
<version>
sesuai dengan proyek Anda.)Untuk Ant , cuplikan di bawah ini akan membantu:
Kredit Michael Niemand -
Untuk Gradle :
sumber
lib
folder itu, maka Anda hanya perlu menjalankan toplesjava -jar myproject.jar
dan akan menemukan dependensinya.jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
maven-jar-plugin
item dalam file Maven yang dihasilkan VSC, jadi saya baru saja menambahkan<configuration>
bagian itu.Seharusnya itu
java -jar app.jar
bukanjava -jar "app"
.The
-jar
pilihan hanya bekerja jika file JAR adalah file JAR executable, yang berarti ia harus memiliki file manifest denganMain-Class
atribut di dalamnya. Lihat Program Pengemasan dalam File JAR untuk mempelajari cara membuat JAR yang dapat dieksekusi.Jika ini bukan JAR yang dapat dieksekusi, maka Anda harus menjalankan program dengan sesuatu seperti:
di mana
com.somepackage.SomeClass
kelas yang berisimain
metode untuk menjalankan program. (Apa kelas itu tergantung pada program, tidak mungkin untuk mengetahui dari informasi yang Anda berikan).sumber
META-INF
direktori di dalam file JAR). Seharusnya berisiMain-Class
atribut yang memberi Anda nama kelas utama.Atau, Anda dapat menggunakan maven-assembly-plugin, seperti yang ditunjukkan pada contoh di bawah ini:
Dalam contoh ini, semua stoples ketergantungan seperti yang ditentukan dalam bagian akan secara otomatis disertakan dalam tabung tunggal Anda. Perhatikan bahwa toples-dengan-dependensi harus benar-benar dimasukkan sebagai, bukan untuk diganti dengan nama file jar yang ingin Anda sertakan.
sumber
maven-assembly-plugin
berhasil.maven-jar-plugin
tidak.pom.xml
file Anda di dalam<build><plugins> PUT IT HERE </plugins></build>
dan kemudian jalankan Paket maven (di menu geser IDEA buka maven di sebelah kanan, cari project> Lifecycle> package). Maka file jar Anda akan berada di folder Target. Bersulang!Itu karena Java tidak dapat menemukan atribut Utama di file MANIFEST.MF. Atribut Utama diperlukan untuk memberi tahu java kelas mana yang harus digunakan sebagai titik masuk aplikasi. Di dalam file jar, file MANIFEST.MF terletak di folder META-INF. Ingin tahu bagaimana Anda bisa melihat apa yang ada di dalam file jar? Buka file jar dengan WinRAR.
Atribut utama di dalam MANIFEST.MF terlihat seperti ini:
Anda mendapatkan kesalahan "tidak ada atribut manifes utama" ini ketika baris ini hilang dari file MANIFEST.MF.
Benar-benar berantakan untuk menentukan atribut ini di dalam file MANIFEST.MF.Pembaruan: Saya baru saja menemukan cara yang sangat rapi untuk menentukan titik masuk Aplikasi dalam gerhana. Ketika Anda mengatakan Ekspor,
sumber
Saya memiliki masalah yang sama. dengan menambahkan baris berikut ke file pom membuatnya berfungsi. Pengaya akan memastikan proses pembuatan aplikasi Anda dengan semua langkah yang diperlukan.
sumber
<parent>...</parent>
aplikasi di pom.xml. Dugaan saya adalah, jika kita mengunjungiparent
pom.xml aplikasi, kita akan mendapatkan ide yang jelas.repackage-classifier
. Silakan kunjungi docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…Jawaban Gradle adalah menambahkan pengaturan toples / manifest / atribut seperti ini:
sumber
Saya mengalami masalah ini saat membuat botol menggunakan IntelliJ IDEA. Lihat diskusi ini .
Apa yang dipecahkan bagi saya adalah membuat kembali artefak jar, memilih JAR> Dari modul dengan dependensi, tetapi tidak menerima Direktori default untuk META-INF / MANIFEST.MF. Ubah dari - / src / main / java ke - / src / main / resources.
Kalau tidak, itu termasuk file manifes dalam jar, tetapi bukan yang ada di - / src / main / java yang seharusnya.
sumber
Untuk pakar, inilah yang memecahkannya (bagi saya, untuk basis kode Veetle di GitHub):
Bersulang...
sumber
mvn package shade:shade
menjalankanmvn package
tidak memicu plugin teduh untuk berjalan.Coba perintah ini untuk memasukkan toples:
sumber
Bagi saya, tidak ada jawaban yang benar-benar membantu - Saya memiliki file manifes di tempat yang benar, berisi Kelas Utama dan segalanya. Yang membuat saya tersandung adalah ini:
( sumber ). Menambahkan baris baru di akhir manifes memperbaikinya.
sumber
Jika menggunakan Maven, termasuk mengikuti di pom
sumber
no main manifest attribute
kesalahan tapi saya bekerja pada aplikasi boot musim semi jadi jawaban ini membantu saya. Saya sudah tahu cara membuatMETA-INF/MANIFEST.MF
file, tetapi tidak bagaimana membuat spring-boot secara otomatis menanganinya.spring-boot
abaikan saja. Stackoverflow juga membantu membangun repositori masalah Anda sendiri yang Anda hadapi saat pemrograman.Saya memiliki masalah yang sama hari ini. Masalah saya terpecahkan ketika saya memindahkan META-INF ke folder resources.
sumber
Saya mendapat kesalahan yang sama tadi. Jika Anda menggunakan
gradle
, tambahkan saja berikutnya di urgradle.build
:Di mana
com.company.project.MainClass
jalan ke kelas Anda denganpublic static void main(String[] args)
metode.sumber
mainClassName
set variabel level atas , tetapi itu hanya membantu dengangradle run
perintah, bukan dengan membuat file .jarMasalah MAVEN adalah bahwa mencoba untuk memasukkan file MANIFEST.MF pertama dari perpustakaan pertama dari dependensi alih-alih MANIFEST.MF KITA SENDIRI KITA SAAT ANDA MENGGUNAKAN artefak! .
Salin MANIFEST yang sebenarnya. Mf yang sudah menghasilkan dalam proyek Anda oleh MAVEN Termasuk di antaranya:
Manifest-Version: 1.0 Main-Class: yourpacket.yourmainclass (untuk exmaple info.data.MainClass)
Ganti konten MANIFEST.MF dari youjar.zip dengan itu.
ATAU!
Sederhana, buat sendiri MANIFEST.MF dan:
Tetapi jika Anda menggunakan panel maven (atau baris perintah maven), Anda bisa memaksanya untuk membuat manifes sendiri dan memasukkannya ke dalam file JAR.
Tambahkan ke bagian build you pom.xml kode ini:
Buka panel MAVEN (di Intellij) dan jalankan "Instal". Ini akan menghasilkan file MANIFEST dan mengkompilasi properti file JAR dengan semua dependensi ke dalam folder "Target". Juga akan diinstal ke repositori pakar lokal.
sumber
Jika toples tidak mengikuti aturan , itu bukan toples yang dapat dieksekusi.
sumber
Saya menghadapi masalah yang sama dan sudah diperbaiki sekarang :) Ikuti saja langkah-langkah di bawah ini dan kesalahannya bisa untuk apa saja, tetapi langkah-langkah di bawah ini membuat prosesnya lebih lancar. Saya menghabiskan banyak waktu untuk menemukan perbaikannya.
1.Coba restart Eclipse (jika Anda menggunakan Eclipse untuk membuat file JAR) -> Sebenarnya ini membantu masalah saya dalam mengekspor file JAR dengan benar.
2. Setelah gerhana ulang, coba lihat apakah gerhana Anda dapat mengenali kelas / metode utama oleh proyek Java Anda -> klik kanan -> Jalankan sebagai -> Jalankan konfigurasi -> Main -> klik tombol Cari untuk melihat apakah gerhana Anda dapat mencari kelas utama Anda di file JAR. -> Ini untuk validasi bahwa file JAR akan memiliki titik masuk ke kelas utama.
Setelah ini, ekspor proyek Java Dynamic Anda sebagai file "Runnable JAR" dan bukan file JAR.
Dalam konfigurasi peluncuran Java, pilih kelas utama Anda.
Setelah mengekspor file jar, gunakan perintah di bawah ini untuk mengeksekusi. java -cp [JAR Anda] .jar [paket lengkap] .MainClass misalnya: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit
Anda mungkin menghadapi kesalahan versi java yang tidak didukung. Cara mengatasinya adalah dengan mengubah java_home di profil shell bash Anda agar sesuai dengan versi java yang digunakan untuk mengkompilasi proyek di gerhana.
Semoga ini membantu! Mohon beri tahu saya jika Anda masih memiliki masalah.
sumber
Saya memiliki masalah yang sama. Banyak solusi yang disebutkan di sini tidak memberi saya gambaran keseluruhan, jadi saya akan mencoba memberi Anda ringkasan tentang cara mengemas file jar dari baris perintah .
Jika Anda ingin memiliki
.class
file Anda dalam paket, tambahkan paket di awal.java
.Test.java
Untuk mengkompilasi kode Anda dengan
.class
file Anda berakhir dengan struktur yang diberikan oleh nama paket gunakan:The
-d .
membuat compiler membuat struktur direktori yang Anda inginkan.Saat mengemas
.jar
file, Anda perlu menginstruksikan toples rutin tentang cara mengemasnya. Di sini kita menggunakan set opsicvfeP
. Ini untuk menjaga struktur paket (opsiP
), tentukan titik masuk sehingga file manifes berisi informasi yang bermakna (opsie
). Opsif
memungkinkan Anda menentukan nama file, opsic
membuat arsip dan opsiv
mengatur output untuk verbose. Hal penting yang perlu diperhatikan di sini adalahP
dane
.Kemudian datang nama toples yang kita inginkan
test.jar
.Lalu tibalah titik masuk.
Dan kemudian datang
-C . <packagename>/
untuk mendapatkan file kelas dari folder itu, melestarikan struktur folder.Periksa
.jar
file di program zip. Seharusnya memiliki struktur berikuttest.jar
MANIFEST.MF harus berisi yang berikut ini
Jika Anda mengedit manifes Anda dengan tangan, pastikan untuk menjaga baris baru di akhir jika tidak java tidak mengenalinya.
Jalankan
.jar
file Anda dengansumber
Saya pribadi berpikir semua jawaban di sini salah memahami pertanyaan. Jawabannya terletak pada perbedaan bagaimana spring-boot membangun .jar. Semua orang tahu bahwa Boot Spring membuat manifes seperti ini, yang bervariasi dari asumsi setiap orang bahwa ini adalah peluncuran .jar standar, yang mungkin atau mungkin tidak:
Mungkin perlu dieksekusi dengan
org.springframework.boot.loader.JarLauncher
di classpath?sumber
File jar yang dapat dieksekusi Harus dijalankan dengan mengklik atau menjalankan menggunakan command prompt seperti java -jar app.jar (gunakan "jika path jar berisi ruang" - yaitu java -jar "C: \ folder name \ app.jar"). Jika toples Anda yang dapat dijalankan tidak berjalan, artinya itu tidak dibuat dengan benar.
Untuk pemahaman yang lebih baik, ekstrak file jar (atau tampilan menggunakan alat apa pun, karena windows 7-Zip bagus) dan periksa file di bawah / META-INF/MANIFEST.MF. Jika Anda menemukan entri seperti
Main-Class: your.package.name.ClaaswithMain - maka tidak apa-apa, jika tidak Anda harus menyediakannya.
Waspadai penambahan entri Kelas Utama pada file MANIFEST.MF, periksa di mana Anda menyimpannya!
sumber
Anda Bisa Cukup ikuti langkah ini. Buat file jar menggunakan
Saat menjalankan file jar jalankan sederhana seperti ini
sumber
Anda mungkin tidak membuat file jar dengan benar:
Karya-karya berikut:
sumber
Jika Anda menggunakan baris perintah untuk merakit .jar dimungkinkan untuk menunjuk ke utama tanpa menambahkan file Manifest. Contoh:
(param "e" melakukan itu: TheNameOfClassWithMainMethod adalah nama kelas dengan metode main () dan app.jar - nama .jar dan * .class yang dapat dieksekusi - hanya semua file kelas untuk dirakit)
sumber
Bagi saya kesalahan ini terjadi hanya karena saya lupa memberi tahu Eclipse bahwa saya menginginkan file jar runnable dan bukan file jar perpustakaan sederhana. Jadi ketika Anda membuat file jar di Eclipse pastikan Anda mengklik tombol radio kanan
sumber
Jawaban di atas hanya membantu saya.
java -cp
adalah bagian dari jawabannya, tetapi saya membutuhkan info yang lebih spesifik tentang cara mengidentifikasi kelas yang akan dijalankan. Inilah yang bekerja untuk saya:Langkah 1: temukan kelas yang harus saya jalankan
Baris teratas dari hasilnya adalah:
App.class berisi kelas utama untuk dijalankan. Saya tidak 100% yakin jika Anda selalu dapat menganggap kelas yang Anda butuhkan adalah yang pertama, tapi itu untuk saya. Jika tidak, saya membayangkan tidak terlalu sulit untuk menggunakan grep untuk mengecualikan hasil yang berhubungan dengan perpustakaan untuk membagi daftar kelas ke ukuran yang dapat dikelola.
Dari sana mudah: Saya hanya menggunakan jalur itu (minus akhiran ".class"):
sumber
java -cp ... somepackage.App
.Karena Anda telah menambahkan MANIFEST.MF, saya pikir Anda harus mempertimbangkan urutan Field dalam file ini. Env saya adalah
java version "1.8.0_91"
dan MANIFEST.MF saya seperti di sini
Namun, ini seperti di bawah ini dijalankan
sumber
(posting pertama - jadi mungkin tidak bersih)
Ini adalah perbaikan saya untuk OS X 11.6, program Netbeans 8.2 berbasis Maven. Hingga saat ini aplikasi saya adalah 100% Netbeans - tidak ada tweaker (hanya beberapa shell lolos untuk yang tidak mungkin!).
Setelah mencoba hampir semua jawaban di sini dan di tempat lain tetapi tidak berhasil, saya kembali ke seni "menggunakan apa yang berhasil".
Jawaban teratas di sini ( olivier-refalo thanx) sepertinya tempat yang tepat untuk memulai tetapi tidak membantu.
Melihat proyek lain yang berhasil, saya perhatikan beberapa perbedaan kecil dalam garis manifes:
Tidak yakin mengapa (saya hanya 3 bulan ke java) atau bagaimana, tetapi hanya bisa mengatakan ini berhasil.
Berikut ini hanya blok manifes yang dimodifikasi yang digunakan:
sumber
Saya menemukan solusi baru untuk generasi manifes buruk!
Klik untuk META-INF
Tambah atau edit
Menambahkan:
Buat file teks yang disebut MANIFEST.MF dalam folder bernama META-INF dan tambahkan baris berikut:
Simpan file dan tambahkan ke zip
Edit:
Buka cmd dan ketik: java -jar c: /path/JarName.jar
Seharusnya bekerja dengan baik sekarang!
sumber
sebagian besar solusi tidak bekerja untuk saya tetapi instruktur saya membantu saya keluar saya ingin berbagi solusinya di sini saya menggunakan terminal kali linux tetapi harus baik-baik saja di semua debian
dalam tipe file
sekarang untuk menjalankan penggunaan file
atau Anda dapat pergi ke properti file dan memeriksa
itu membantu saya sementara sebagian besar jawaban di atas tidak
sumber
Anda mungkin memiliki masalah yang sama seperti saya. Setelah membuat file .jar Anda, tulis
jar xf app.jar META-INF/MANIFEST.MF
. Ini akan membuat salinan file ke direktori Anda saat ini sehingga Anda dapat membacanya. Jika hanya mengatakan sesuatu seperti:dan tidak mengandung deklarasi "Main-Class", maka saya pikir Anda menemukan masalah Anda.
Saya tidak tahu bagaimana mengatasinya. Saya memeriksa orang lain dengan masalah yang sama / mirip pada StackOverflow dan tidak dapat menemukan jawaban. Namun dengan informasi ini Anda mungkin bisa mendapatkan bantuan yang lebih baik (mengingat fakta bahwa Anda memiliki masalah yang sama dengan saya).
Sunting: Saya telah mencoba dengan file manifes tetapi tidak berhasil, tetapi kesalahan saya adalah hanya menyebutkan salah satu kelas saat membuat file jar. Saya menulis * .class sebagai gantinya dan berfungsi sekarang.
Meskipun saya tidak tahu mengapa ada kebutuhan untuk membuat file manifes. Tapi saya kira itu baik-baik saja asalkan berfungsi.
sumber
Saya memiliki masalah ini dan saya menyelesaikannya baru-baru ini dengan melakukan ini di Netbeans 8 (Lihat gambar di bawah):
sumber