IntelliJ IDEA'da yanlış Manifest.mf oluşturuldu .jar


102

OptaPlanner 6.0.1 kitaplıklarını kullanan bir projeyi IntelliJ IDEA'nın jar artefaktıyla bir .jar'a paketlemeye çalışıyorum, ancak standardı içeren manifest.mf'm yerine

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

kavanoz, OptaPlanner'ın destekleyici kitaplıklarından biri olan ecj-3.7.2.jar'da verileni kullanır:

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

Bu nedenle "no main manifest attribute, in appname.jar", uygulamayı çalıştırmaya çalışırken bir hata oluşuyor. .Jar dosyasındaki manifest dosyasını benimkiyle manuel olarak değiştirirsem, her şey doğru çalışır. Bunu düzeltmek için yapabileceğim bir şey var mı?

Kitaplıkları ayrı bir / lib dizininde tutuyorum ve bunlar jar yapısının köküne Extracted Directory olarak eklenmişler, IntelliJ IDEA v13.0.1.


1
Karınca, maven veya gradle gibi aletler yapmayı biliyor musunuz?
MariuszS

Bunları biliyorum, ancak şimdiye kadar sadece make ve .NET muadillerini kullandım (NAnt, MSBuild). IntelliJ'in derleme aracı kesmiyorsa hangisini seçmeliyim?
grudolf

1
Oy Bu sorunu gidermek için burada ,
bigjosh

Yanıtlar:


260

Ben de aynı sorunu yaşadım.

MANIFEST.MF'nizin içinde olduğundan emin olun:

src/main/resources/META_INF/

DEĞİL

src/main/java/META_INF/

20
Bu gerçekten doğru cevap, görünen o ki Intellij IDEA, proje şablonu Maven olduğunda META-INF klasörünü yanlış yerleştiriyor
Kumait

Benim durumumda projemin düzenini değiştirmek zorunda kaldım. Daha önce maven layoutlu bir projem vardı ama maven desteğini kaldırdım. Bir projeyi sıfırdan yeniden yaratıyorum ve şimdi çalışıyor.
Maxence

1
Bu benim için çalışmıyordu, Mainfest dosyasını projenin köküne taşımam gerekiyordu.
racs

Maven bu dosyayı yanlış dizine yerleştirecek kadar aptal mı? : ^)
Daria

@Kumait, sorun IntelliJ 2017.1.5'te hala var. JetBrain ekibinin bunun farkında olup olmadığını merak ediyorum.
fruqi

12

Düzeltmek:

  1. Dosya> Proje Yapısı
  2. Soldaki Proje Ayarları altında "Yapılar" ı seçin
  3. Orta bölmede JAR tanımını bulun ve seçin
  4. "Çıktı Düzeni" sekmesinin sol bölmesinde jar dosyasını listede bulun ve seçin
  5. Alt kısımda, "Mevcut Manifest'i Kullan" düğmesini tıklayın ve proje kaynağınızdaki manifest dosyasını seçin.
  6. Tamam'a tıklayın ve derlemeyi çalıştırın

3
"Mevcut Manifest'i Kullan" düğmesi yok, ancak Çıktı Düzenindeki Manifest dosyası doğru konumu gösteriyor (... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf

5
Tamam, jar yapısını silmek ve yeniden oluşturmak zorunda kaldı, bu sefer "Bağımlılık içeren modüllerden" yerine "Boş" olarak. "Manifest Oluştur" ve "Varolan Manifest'i Kullan" düğmelerini aldım, Manifest'e işaret etti ve kitaplıklarımı okudum ve çıktısını derledim. Önceden iki fark vardır: META_INF \ MANIFEST.INF artık çıktı düzenine açıkça dahil edilmiştir ve jar dosyası doğru şekilde oluşturulmuş gibi görünüyor. :)
grudolf

Bu sorunu çözmüyor, en azından benim için. jamahn'ın cevabı ancak işe yaradı.
Andrew Breksa

Düşük temsilci kullanıcısı @ ds-adaletinden aşağıdaki yorum eklendi - @ grudolf'un boş bir Jar oluşturma hakkındaki yorumu, içe aktarılan bir Gradle projesiyle birkaç saat uğraştıktan sonra benim için çalışan tek şeydi. Bu önemli bir sorudur, lütfen yorumunuzu ayrı bir cevap olarak yeniden yayınlamayı düşünün.
Shawn Meehan

10

@ Grudolf'un diğer yanıtlardan birindeki yorumunda belirtildiği gibi, bunu yapmanın bir yolu (ve içe aktarılmış bir Gradle projesinde benim için çalışan tek yol) aşağıdaki gibi boş bir kavanoz oluşturmaktır:

  • Proje Yapısı -> Artefaktlar -> + Kavanoz -> Boş
  • Orta bölmede artık Manifest Oluştur ve Mevcut Manifest'i Kullan düğmeleri var. Bunlardan birini kullanın.
  • Bağımlı kitaplıkları kendi bildirimleriyle çıktı köküne çıkarırsam, zaman zaman elle oluşturulan yeni bildirimin üzerine yazıyor gibiydiler. İşlemlerin sırasını karıştırmak, işe yaramasını sağladı.

GÜNCELLEME:

Bu kesinlikle Idea'daki bir hatadır. Bu bağlantılı cevap , ayıklanmış dizinler olduğunda güvenilir şekilde çalışır. Özünde, kendi .idea / JARNAME.xml, aşağıdaki öğeyi ekleyin ekleyin bulmak çok üst ait <root>sizin kavanoz için eleman. Yeni dosya kopyanızın üzerinde bulunan ve bir bildirim içeren tüm ayıklanmış öğeler yeni bildiriminizi bozacaktır.

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

7

Ana Sınıfı belirtmek istiyorsanız, bu eklentiyi pom.xml'ye eklemelisiniz:

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

1

Benzer bir problemim vardı.

Sorun pom.xml dosyasındaydı.

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

Tutulma sırasında bu kodun hangi nedenle çalıştığını bilmiyorum ama IntelliJ'de çalışmıyor

Bu doğru.

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

Manifest.mf çalıştı !!!

Umarım bu yardımcı olur.


Tam olarak bu durumu yaşadım ve sizinle aynı sonuca ulaştım: <Dependencies> öğeleri arasındaki satırsonları Eclipse'de çalışıyordu, ancak Intellij IDEA'da çalışmıyordu.
Arion Krause

0

Çalıştırılabilir kavanozlar oluşturmanın birkaç yolu vardır. IntelliJ'in GUI özelliğini kullanmak iyi bir yoldur. Bir başka yolu kullanmaktır Maven birikmesi sunucu dostudur (gradle, buildr, vb veya benzer):

Optaplanner örnekleri maven build'den aşağı yukarı kopyalanabilir:

  1. Son kullanıcı jar'i (optaplanner-örnekler - *. Jar) bildiriminde bağımlılıklarının sınıf yolunu içermelidir .
  2. Sh ve bat betiği daha sonra bu kavanozu uygun şekilde çalıştırmalıdır.

0

Manifest gibi bir problem yaşamamak için, "src" dizininde "META-INF" adlı bir dizine sahip olmalısınız. Öyleyse, oluşturun ve içine aşağıdaki içeriğe sahip "MANIFEST.MF" adlı bir dosya koyun:

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

Yukarıdaki Main class içeren paketin adını değiştirmeyi unutmayınız!


5
Kayıtlara göre, Ağustos ayında görev yerinizden dini materyalleri kestim. Topluluğun yayınlara dini temalar eklemeyi tartıştığını lütfen unutmayın ve cevap, onların dışarıda bırakılmasını tercih ederiz. Yine de onları profilinize veya avatarınıza eklemekte özgürsünüz.
2016
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.