Manifest.mf salah di IntelliJ IDEA dibuat .jar

102

Saya mencoba mengemas proyek menggunakan pustaka OptaPlanner 6.0.1 menjadi .jar melalui artefak jar IntelliJ IDEA tetapi bukannya manifest.mf saya yang berisi standar

Manifest-Version: 1.0
Main-Class: a.b.c.app

jar menggunakan yang disediakan di ecj-3.7.2.jar, salah satu pustaka pendukung OptaPlanner:

Manifest-Version: 1.0
Build-Jdk: 1.6.0_26
Built-By: ibrandt
Created-By: Apache Maven
Archiver-Version: Plexus Archiver

Karena itu, "no main manifest attribute, in appname.jar"terjadi kesalahan saat mencoba menjalankan aplikasi. Jika saya mengganti manifes secara manual dalam file .jar dengan milik saya semuanya bekerja dengan benar. Apakah ada yang bisa saya lakukan untuk memperbaikinya?

Saya menyimpan perpustakaan di direktori / lib terpisah dan mereka ditambahkan ke root artefak jar sebagai Direktori yang Diekstrak, IntelliJ IDEA adalah v13.0.1.

grudolf
sumber
1
Tahukah Anda membangun alat seperti semut, maven atau gradle?
MariuszS
Saya tahu tentang mereka, tetapi sejauh ini saya hanya menggunakan mitra make dan .NET (NAnt, MSBuild). Manakah di antara mereka yang harus saya pilih jika alat build IntelliJ tidak dapat memotongnya?
grudolf
1
Beri suara untuk memperbaiki masalah ini di sini ,
bigjosh

Jawaban:

260

Saya memiliki masalah yang sama.

Pastikan MANIFEST.MF Anda ada di:

src/main/resources/META_INF/

TIDAK

src/main/java/META_INF/
jamhan
sumber
20
Ini adalah jawaban yang benar, tampaknya Intellij IDEA salah menempatkan folder META-INF ketika template proyeknya adalah Maven
Kumait
Dalam kasus saya, saya harus mengubah tata letak proyek saya. Saya sebelumnya memiliki proyek dengan tata letak maven tetapi saya menghapus dukungan maven. Saya membuat ulang proyek dari awal dan sekarang berhasil.
Maxence
1
Ini tidak berhasil untuk saya, saya harus memindahkan file Mainfest ke root proyek.
balapan
Apakah maven begitu bodoh sehingga menempatkan file ini ke direktori yang salah? : ^)
Daria
@Kumm, masalahnya masih ada di IntelliJ 2017.1.5. Saya bertanya-tanya apakah tim JetBrain mengetahui hal ini.
fruqi
12

Memperbaiki:

  1. File> Struktur Proyek
  2. Di bawah Pengaturan Proyek di sebelah kiri, pilih "Artifacts"
  3. Temukan definisi JAR di panel tengah dan pilih itu
  4. Di panel kiri tab "Output Layout", temukan file jar dalam daftar dan pilih
  5. Di bagian bawah, klik tombol "Gunakan Manifes yang Ada" dan pilih file manifes yang ada di sumber proyek Anda.
  6. Klik OK dan jalankan build
Javaru
sumber
3
Tidak ada tombol "Gunakan Manifes yang Ada", namun file Manifes dalam Tata Letak Output mengarah ke lokasi yang benar (... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf
5
Oke, harus menghapus artefak jar dan membuatnya kembali, kali ini sebagai "Kosong", bukan "Dari modul dengan dependensi". Dapatkan tombol "Buat Manifes" dan "Gunakan Manifes yang Ada", arahkan ke Manifes saya dan pustaka yang telah dibaca dan hasil kompilasi. Ada dua perbedaan dari sebelumnya: META_INF \ MANIFEST.INF sekarang secara eksplisit disertakan dalam tata letak keluaran dan file jar tampaknya dibuat dengan benar. :)
grudolf
Ini tidak menyelesaikan masalah, setidaknya bagi saya. Namun jawaban jamahn berhasil.
Andrew Breksa
Komentar ditambahkan dari pengguna bereputasi rendah @ ds-justice sebagai berikut - Komentar @grudolf di atas tentang membuat Jar kosong adalah satu-satunya hal yang berhasil bagi saya setelah beberapa jam berjuang dengan proyek Gradle yang diimpor. Ini adalah pertanyaan penting, mohon pertimbangkan untuk mengirim ulang komentar Anda sebagai jawaban terpisah.
Shawn Mehan
10

Seperti disebutkan dalam komentar @ grudolf di salah satu jawaban lain, satu cara untuk melakukan ini (dan satu-satunya yang berhasil untuk saya dalam proyek Gradle yang diimpor) adalah dengan membuat toples kosong seperti berikut:

  • Struktur Proyek -> Artefak -> + Jar -> Kosong
  • Panel tengah sekarang memiliki tombol Buat Manifes dan Gunakan Manifes yang Ada. Gunakan salah satunya.
  • Saya mengalami kesulitan jika saya mengekstrak library dependen dengan manifesnya sendiri ke dalam root keluaran, mereka tampaknya sesekali menimpa manifes baru yang dibuat secara manual. Mengotak-atik urutan operasi tampaknya membuatnya berhasil.

MEMPERBARUI:

Ini jelas merupakan bug di Idea. Jawaban terkait ini bekerja dengan andal ketika ada direktori yang diekstrak. Pada intinya, Anda menemukan .idea Anda / JARNAME.xml, menambahkan menambahkan elemen berikut ke paling atas dari <root>elemen untuk jar Anda. Elemen apa pun yang diekstrak di atas salinan file baru Anda yang berisi manifes akan merusak manifes baru Anda.

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>
Musim gugur
sumber
7

Jika Anda ingin menentukan Kelas Utama, Anda harus menambahkan plugin ini ke pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>Form</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
usbo
sumber
1

Saya memiliki masalah serupa.

Masalahnya ada di file pom.xml.

<archive>
  <manifestEntries>
    <Dependencies>one.jar,
                  two.rar, 
                  other.jar
    </Dependencies>
  </manifestEntries>
</archive>

Saya tidak tahu untuk alasan apa kode ini berfungsi di gerhana, tetapi tidak di IntelliJ

Ini benar.

<archive>
  <manifestEntries>
    <Dependencies>one.jar, two.rar, other.jar</Dependencies>
  </manifestEntries>
</archive>

Manifest.mf bekerja !!!

Saya harap ini membantu.

marcelocesar
sumber
Saya memiliki situasi yang persis seperti ini dan mencapai kesimpulan yang sama seperti yang Anda lakukan: baris baru antara item <Dependensi> berfungsi di Eclipse, tetapi tidak di Intellij IDEA.
Arion Krause
0

Ada beberapa cara untuk membuat toples yang dapat dieksekusi. Menggunakan fitur GUI IntelliJ adalah salah satu cara yang baik. Cara lain adalah dengan menggunakan Maven (atau serupa di gradle, buildr, dll) yang ramah build-server:

Ini lebih atau kurang dapat disalin dari contoh optaplanner maven build:

  1. Jar pengguna akhir (optaplanner-example - *. Jar) harus menyertakan jalur kelas dari dependensinya dalam manifesnya .
  2. Skrip sh dan bat kemudian harus menjalankan toples itu dengan sesuai.
Geoffrey De Smet
sumber
0

Agar tidak ada masalah seperti Manifest, Anda harus memiliki direktori bernama "META-INF" di direktori "src". Jadi, buat dan letakkan file bernama "MANIFEST.MF" di dalamnya dengan konten berikut:

Manifest-Version: 1.0
Main-Class: <packageName>.Main

Tidak lupa mengganti nama paket yang berisi kelas Utama di atas!

Mohsen Abasi
sumber
4
Catatan menunjukkan bahwa saya memangkas materi keagamaan dari postingan Anda pada bulan Agustus. Harap perhatikan bahwa komunitas telah membahas penambahan tema religius ke dalam postingan, dan jawabannya adalah kami lebih suka jika tidak disertakan. Anda dipersilakan untuk menambahkannya ke profil atau avatar Anda.
halfer