Jar dosyası yürütülemiyor: “ana manifest özelliği yok”


971

Bir uygulama yükledim, çalıştırmayı denediğimde (yürütülebilir bir kavanoz) hiçbir şey olmuyor. Ben komut satırından ile çalıştırdığınızda:

java -jar "app.jar"

Aşağıdaki mesajı alıyorum:

"app.jar" da ana bildirim özelliği yok

Normalde, programı kendim oluştursaydım, manifest dosyasına bir ana sınıf özniteliği eklerdim. Ancak bu durumda, dosya bir uygulamadan olduğu için bunu yapamam. Ayrıca ana sınıfı bulabilecek olup olmadığımı görmek için kavanozu çıkarmaya çalıştım, ancak birçok sınıf var ve hiçbirinin adında "ana" kelimesi yok. Bunu düzeltmenin bir yolu olmalı çünkü program diğer sistemlerde iyi çalışıyor.


Ana yöntemleri arayın; sınıf isimlerine güvenemezsiniz.
Dave Newton

2
Biliyorum, ama sadece .class dosyalarım olduğu için yöntemleri gerçekten göremiyorum. Yoksa yapabilir miyim?
Ewoud

Alıntıları gerçekten yazmıyorsunuz, değil mi? Her durumda, yöntemleri dahil olmak üzere yöntemleri görmenin birkaç yolu vardır javap. Yine de, kavanozu çözmek ve aslında tezahür yok mu diye bakmak isteyebilirsiniz.
Dave Newton

İlgili: bağımlılıklar ile: stackoverflow.com/a/23986765/360211
weston

CommandLineJobRunner
Kamini

Yanıtlar:


946

Birincisi, biraz garip, kaçtığını görmek java -jar "app"ve değiljava -jar app.jar

İkincisi, bir kavanozu yürütülebilir hale getirmek için ... META-INF / MANIFEST.MF adlı bir dosyayı karıştırmanız gerekir.

dosyanın kendisi (en azından) bu bir astara sahip olmalıdır:

Main-Class: com.mypackage.MyClass

Genel statik void main (String [] args) giriş noktasını com.mypackage.MyClasstutan sınıf nerede .

Bunu CLI, Maven, Ant veya Gradle ile yapmanın birkaç yolu olduğunu unutmayın:

İçin CLI , aşağıdaki komutu yapacak: (tks @ dvvrt ) jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

İçin Maven , aşağıdaki parçada gibi bir şey hile yapmak gerekir. Bunun sadece eklenti tanımı olduğunu, tam pom.xml olmadığını unutmayın :

<build>
  <plugins>
    <plugin>
      <!-- Build an executable JAR -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.1.0</version>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.mypackage.MyClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

( <version>Projenize uygun olanı seçin .)

İçin Ant , yardımcı olmalıdır aşağıda pasajı:

<jar destfile="build/main/checksites.jar">
  <fileset dir="build/main/classes"/>
  <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
  <manifest>
    <attribute name="Main-Class" value="com.acme.checksites.Main"/>
  </manifest>
</jar>

Kredi Michael Niemand -

İçin Gradle :

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}

15
Ant'de, <jar> öğesi içindeki <manifest> <attribute name = "Main-Class" value = "com.mypackage.MyClass" /> </manifest>
Michael Niemand 15:03

1
Teşekkür ederim. Bunu kullanarak bağımlılıkları lib klasörüne kopyalayabileceğinizi eklemek istedim: stackoverflow.com/a/996915/1121497 . Sınıf yolu bu libklasörü içerdiğinden, yalnızca kavanozu yürütmeniz gerekir java -jar myproject.jarve bağımlılıkları bulur.
Ferran Maylinch

4
NASIL "META-INF / MANIFEST.MF adlı bir dosya jar"? Bir yanda bir .jar ve diğer yanda bir .MF var, bunları nasıl birbirine bağlarım? Manifest'i .jar ile aynı klasöre koydum, ancak çalışmıyor Sorun hala var!
Wicelo

4
@Wicelo Bir jar dosyası oluştururken belirli bir MANIFEST.MF dosyasını belirtmek için jar için m işaretini kullanın . Örneğin. jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
dvvrt

1
Not: Maven için, maven-jar-pluginVSC tarafından oluşturulan Maven dosyasında zaten bir öğe vardı , bu yüzden <configuration>bölümü buna ekledim .
Aaron Franke

279

Bunun java -jar app.jaryerine olmalıydı java -jar "app".

Bu -jarseçenek yalnızca JAR dosyası yürütülebilir bir JAR dosyasıysa çalışır; bu, içinde bir Main-Classözniteliğe sahip bir bildirim dosyasına sahip olması gerektiği anlamına gelir . Yürütülebilir bir JAR'ın nasıl oluşturulacağını öğrenmek için JAR Dosyalarındaki Paketleme Programları'na bakın .

Yürütülebilir bir JAR değilse, programı aşağıdaki gibi bir şeyle çalıştırmanız gerekir:

java -cp app.jar com.somepackage.SomeClass

nerede programı çalıştırmak için yöntem com.somepackage.SomeClassiçeren sınıf main. (Bu sınıfın programa bağlı olduğu, sağladığınız bilgilerden söylemek mümkün değildir).


3
Cevabınız için teşekkürler, ancak çözümünüz yalnızca ana yöntemi içeren sınıfın adını biliyorsanız çalışır. Ve bu bir yazım hatasıydı ... "app.jar" olması gerekiyordu. Ancak dosyayı çift tıklatarak neden diğer sistemlerde çalıştığını nasıl açıklarsınız?
Ewoud

Gerçekten yürütülebilir bir JAR ise, manifest dosyasını ayıklayabilirsiniz ( META-INFJAR dosyasının içindeki dizinde bulunur). Main-ClassSize ana sınıfın adını veren bir özellik içermelidir .
Jesper

Bir sistemde çalışmazsa, o sistemde çok eski bir Java sürümü olabilir. JAR örneğin Java 7 ile derlenmişse, Java 6 veya daha eski bir sistemde çalıştıramazsınız.
Jesper

Diğer sistem win7 çalıştırdığı ve sorunları olan bu pc win8 çalıştırdığı için bu komik.
Ewoud

2
@Jesper Merhaba, tutulma varsayılan paketi kullanıyorsa ne olur? Sınıf adını mı koydum?
Ogen

127

Alternatif olarak, aşağıdaki örnekte gösterildiği gibi maven-assembly-eklentisini kullanabilirsiniz:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.package.MainClass</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin> 

Bu örnekte, bölümde belirtilen tüm bağımlılık kavanozları otomatik olarak tek kavanozunuza dahil edilecektir. Bağımlılığa sahip jar'lerin, eklemek istediğiniz jar dosyası adlarıyla değiştirilmemesi için tam anlamıyla yerleştirilmesi gerektiğini unutmayın.


3
Mükemmel, bu işe yarıyor. Tüm bağımlılıkları bir kavanoza paketler, böylece bir projeyi derlemenize / derlemenize ve kutudan çıkarmanıza izin verir.
Paul

2
Gölge eklentisi bağlamında , Yürütülebilir JAR'daki yardımı takip etmek gerekir .
koppor

3
Bu ile maven-assembly-pluginçalıştı. maven-jar-pluginolmadı.
Martynas Jusevičius

Not: bu kodu pom.xmldosyanızın içine koyun <build><plugins> PUT IT HERE </plugins></build>ve ardından maven Paketini yürütün (sağdaki IDEA açık maven sürgülü menüsünde proje> Yaşam Döngüsü> paketini arayın). Daha sonra jar dosyanız Hedef klasörde olacaktır. Şerefe!
Kirill Karmazin

Bu konuda gerçekten zorlanıyordum ... Bu mükemmel çalışıyor. Teşekkürler!
jmojico

60

Java ana özniteliği MANIFEST.MF dosyasında bulamıyor olmasıdır. Main özniteliği, java'ya uygulamanın giriş noktası olarak hangi sınıfı kullanması gerektiğini söylemek için gereklidir. Jar dosyasının içinde MANIFEST.MF dosyası META-INF klasöründe bulunur. Bir kavanoz dosyasının içinde ne olduğuna nasıl bakabileceğinizi mi merak ediyorsunuz? Jar dosyasını WinRAR ile açın.

MANIFEST.MF içindeki ana özellik şöyle görünür:

Main-Class: <packagename>.<classname>

Bu satır MANIFEST.MF dosyasında eksik olduğunda bu "ana manifest özniteliği" hatası alırsınız.

Bu özelliği MANIFEST.MF dosyasında belirtmek gerçekten büyük bir karışıklık.

Güncelleme: Uygulamanın giriş noktasını tutulmada belirtmek için gerçekten düzgün bir yol buldum. Dışa Aktar dediğinizde,

Select Jar and next 

[ give it a name in the next window ] and next

and next again

and you'll see " Select the class of the application entry point".

Just pick a class and Eclipse will automatically build a cool MANIFEST.MF for you.

resim açıklamasını buraya girin


32

Aynı sorunu yaşadım. pom dosyasına aşağıdaki satırları ekleyerek çalışmasını sağladı. Eklenti, uygulamanızın tüm gerekli adımlarla derleme sürecini sağlayacaktır.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

2
mükemmel çalıştı, ancak Nisan 2018'den itibaren sürümü eklemeyi düşünün / sürüm> </plugin>
Tenflex

Üzgünüz ama bu bir çözüm değil çünkü Spring Boot hakkında konuşmuyor, kavanoz yürütme ile ilgili genel bir sorun :)
LAMRIN TAWSRAS

Çok teşekkürler, bu bahar çizme problemini çözdü!
AleksandarT

Ben bahar çizme 2.2.0 üzerinde çalışıyorum. Ne yazık ki, bu çözüm benim için işe yaramadı. Ancak, <parent>...</parent>pom.xml'deki bir uygulamadan başvurduğunuzda çalışır. Tahminimce, parentuygulamanın pom.xml adresini ziyaret edersek, net bir fikir ediniriz.
tusar

Sonunda gelenekle ilgili sorunumu çözdüm repackage-classifier. Lütfen docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…
tusar

30

Gradle cevabı şöyle bir jar / manifest / attributes ayarı eklemektir:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}

1
şimdiye kadarki en basit cevap.
lasec0203

29

IntelliJ IDEA kullanarak bir kavanoz oluştururken bu sorunu yaşadım. Bu tartışmaya bakın .

Benim için çözen, kavanoz artefaktını yeniden oluşturmak, JAR> Bağımlılığa sahip modüllerden, ancak META-INF / MANIFEST.MF için varsayılan Dizini kabul etmemekti. - / src / main / java yerine - / src / main / resources yazın.

Aksi takdirde, kavanoza bir manifest dosyası içeriyordu, ancak olması gereken - / src / main / java dosyasında değil.


Bu benim için IDEA 14.1.6 ile çalıştı. Ayrıca pom.xml için build özelliğini ekledim ama hiçbir etkisi olmadı. Ama cevabınız çözdü, teşekkürler.
lsrom

3
Masaüstümü çalışan başka hiçbir şeyin saf hayal kırıklığı ile çökertilmekten kurtardığınız için teşekkürler;) Bağlantınız kopuk görünüyor, ancak bunun mükemmel çalıştığını doğrulayabilirim. IntelliJ IDEA 2018.2.5 (Topluluk Sürümü) ile test edildi
Matthias

i / resources dizini yok olmasına rağmen, bu işe yaradığını doğruladı
lxknvlk

28

Maven için bunu çözdü (benim için GitHub'daki Veetle kod tabanı için):

<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>org.lazydevs.veetle.api.VeetleAPI</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
 </plugins>
</build>

Şerefe ...


Bu işe yaradı buldum ama mvn package shade:shadesadece çalıştırmak mvn packageiçin çalıştırmak için gölge eklentisi tetiklemiyor gibi yürütmek zorunda kaldı .
Raystorm

24

Kavanozu dahil etmek için bu komutu deneyin:

java -cp yourJarName.jar your.package..your.MainClass

1
Bir yolu ana sınıfı pom.xml dosyasına dahil etmek ve java -jar komutunu kullanmak, diğeri ise java -cp komutunu kullanmaktır.
Gaurav Khare

15

Benim için, cevapların hiçbiri gerçekten yardımcı olmadı - Ana Sınıfı ve her şeyi içeren manifest dosyasını doğru yerde buldum. Beni şaşırtan şey şuydu:

Uyarı: Manifesto oluşturduğunuz metin dosyası yeni bir satır veya satır başı ile bitmelidir. Son satır, yeni bir satır veya satır başı ile bitmezse düzgün ayrıştırılmaz.

( kaynak ). Manifestin sonuna yeni satır eklemek sorunu düzeltti.


11

Maven kullanıyorsanız, pom'a aşağıdakileri ekleyin

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3
Bunun bir Spring Boot projesi olduğunu kim söyledi?
james.garriss

2
@ james.garriss iyi diyebilirim ki, bu yazıya no main manifest attributehata aramak için geldim ama bahar önyükleme uygulaması üzerinde çalışıyorum, bu yüzden bu cevap bana yardımcı oldu. Nasıl META-INF/MANIFEST.MFdosya oluşturulacağını zaten biliyordum , ancak bahar önyüklemesinin otomatik olarak nasıl yapılacağını bilmiyorum.
Vishrant

5
Bu cevabı küçümsemek için bir neden göremiyorum. Eğer kullanmıyorsanız spring-bootsadece dikkate almayın. Stackoverflow ayrıca programlama sırasında karşılaştığınız kendi sorun deponuzu oluşturmanıza yardımcı olur.
Vishrant

@Vishrant Başkalarını bilmiyorum ama aşağı düştüm çünkü bu cevap sorulduğu gibi soruya cevap vermiyor. Sorunuzu cevaplamak yeni olmuş olabilir , ancak sorunuz gerçekten sorulan şey değildi.
Bane

@ Emin olun. ancak soru geniş anlamda alınabilir ve bu cevap bunun için geçerlidir ve başkalarına bahar botunu ne zaman kullanacakları konusunda yardımcı olabilir.
Vishrant

10

Bugün de aynı sorunu yaşadım. Sorunum, META-INF'i kaynaklar klasörüne taşımakla çözüldü.


Bu benim için de işe yaradı. Jetbrains IntelliJ
NickSoft

Bu gerçekten benim için çalıştı :)
Syed Mehtab Hassan

Bu benim için intellij'de de işe yaradı. Teşekkür ederim dostum.
Waqas

10

Şimdi aynı hatayı aldım. Eğer u kullanıyorsanız gradle, sadece bir sonrakini ekleyin gradle.build:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.company.project.MainClass'
    }
}

Nerede com.company.project.MainClassur sınıf public static void main(String[] args)yöntemi ile yol .


Bu bana yardımcı oldu! sınıf öğreticileri en üst düzey mainClassNamedeğişken kümesini kullanarak belirtmişlerdi , ancak bu sadece gradle runkomutla yardımcı oluyor , yürütülebilir bir .jar oluşturmada değil
kevlarr

8

MAVEN sorunu, YAPILARINIZI kullandığınızda KENDİ MANIFEST.MF yerine bağımlılıklardan ilk kütüphaneden ilk MANIFEST.MF dosyasını dahil etmeye çalışmasıdır ! .

  1. Yourjar.jar dosyasını yourjar.zip olarak yeniden adlandırın
  2. META-INF \ MANIFEST.MF'den MANIFEST.MF dosyasını açın
  3. MAVEN tarafından projenizde oluşturulan gerçek MANIFEST.MF dosyasını kopyalayın.

    Manifest-Versiyon: 1.0 Ana Sınıf: yourpacket.yourmainclass (exmaple info.data.MainClass için)

  4. MANIFEST.MF içeriğini youjar.zip dosyasından onunla değiştirin.

  5. Yourjar.zip dosyasını yourjar.jar olarak yeniden adlandırın.
  6. Şimdi java -jar yourjar.jar mükemmel çalışıyor.

VEYA!

Basit kendi MANIFEST.MF oluşturmak ve:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifestFile> Your path like: src/main/resources/META-INF/MANIFEST.MF </manifestFile>
            <index>true</index>
                <manifest>
                    <addClasspath>true</addClasspath>
                </manifest>
        </archive>
    </configuration>
</plugin>

Ancak maven panelini (veya maven komut satırını) kullanırsanız, kendi bildirim oluşturmaya ve JAR dosyasına dahil etmeye zorlayabilirsiniz.

  1. Size pom.xml'in derleme bölümüne şu kodu ekleyin:

    <plugins>
        <plugin>
    
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
    
            <archive>
    
                <index>true</index>
    
                <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass> yourpacket.yourmainclass (for exmaple info.data.MainClass)</mainClass>
                </manifest>
                <manifestEntries>
                    <mode>development</mode>
                    <url>${project.url}</url>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>

  2. MAVEN panelini (Intellij'de) açın ve "Yükle" işlemini yürütün. MANIFEST dosyasını oluşturur ve tüm bağımlılıkları olan JAR dosyasını "Target" klasörüne derler. Ayrıca yerel maven deposuna kurulacaktır.



5

Aynı sorunla karşılaştım ve şimdi düzeltildi :) Sadece aşağıdaki adımları izleyin ve hata herhangi bir şey için olabilir, ancak aşağıdaki adımlar süreci daha pürüzsüz hale getirir. Düzeltmeyi bulmak için çok zaman harcıyorum.

1. Eclipse'i yeniden başlatmayı deneyin (JAR dosyasını oluşturmak için Eclipse kullanıyorsanız) -> Aslında bu, JAR dosyasını düzgün bir şekilde dışa aktarmamda sorunuma yardımcı oldu.

Eclipse yeniden başlatıldıktan sonra, eclipse'nizin Java projeniz tarafından ana sınıfı / yöntemi tanıyabildiğini görmeye çalışın -> sağ tıklayın -> Farklı çalıştır -> Yapılandırmaları çalıştır -> Ana -> Ara düğmesini tıklayın tutulmanın JAR dosyasındaki ana sınıfınızı arayabildiğini görmek için. -> Bu, JAR dosyasının ana sınıfa giriş noktası olacağını doğrulamak içindir.

  1. Bundan sonra, Java Dynamic projenizi JAR dosyası olarak değil "Runnable JAR" dosyası olarak dışa aktarın.

  2. Java başlatma yapılandırmasında ana sınıfınızı seçin.

  3. Jar dosyasını dışa aktardıktan sonra, yürütmek için aşağıdaki komutu kullanın. java -cp [JAR] .jar [tam paket] .AnaClass örneğin: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit

  4. Desteklenmeyen java sürüm hatasıyla karşılaşabilirsiniz. düzeltme, kabuk bash profilinizdeki java_home'u, projenin tutulmada derlenmesi için kullanılan java sürümüyle eşleşecek şekilde değiştirmektir.

Bu yardımcı olur umarım! Hala herhangi bir sorununuz varsa lütfen bize bildirin.


5

Ben de aynı problemi yaşadım. Burada bahsedilen çözümlerin birçoğu bana tüm resmi vermedi, bu yüzden size komut satırından jar dosyalarını nasıl paketleyeceğinizin bir özetini vermeye çalışacağım .

  1. .classDosyalarınızı paketler halinde almak istiyorsanız , paketi .java.

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
  2. Kodunuzu .class, paket adının verdiği yapı ile biten dosyalarınızla derlemek için şunu kullanın:

    javac -d . Test.java

    -d .Derleyici istediğiniz dizin yapısını oluşturmak yapar.

  3. .jarDosyayı paketlerken, kavanoz rutinine nasıl paketleneceği konusunda talimat vermeniz gerekir. Burada seçenek setini kullanıyoruz cvfeP. Bu, paket yapısını (isteğe bağlı P) korumak, manifest dosyasının anlamlı bilgiler (seçenek ) içermesi için giriş noktasını belirtmektire . Seçenek fdosya adını belirtmenizi sağlar, seçenek cbir arşiv oluşturur ve seçenek vçıktıyı ayrıntılı olarak ayarlar. Burada dikkat edilmesi gereken önemli noktalar Pve e.

    Sonra istediğimiz kavanozun adı geliyor test.jar.

    Sonra giriş noktası geliyor.

    Ve sonra -C . <packagename>/klasör yapısını koruyarak sınıf dosyalarını o klasörden almaya gelir .

    jar cvfeP test.jar testpackage.Test -C . testpackage/
  4. .jarBir zip programında dosyanızı kontrol edin . Aşağıdaki yapıya sahip olmalıdır

    test.jar

    META-INF
    | MANIFEST.MF
    testpackage
    | Test.class

    MANIFEST.MF aşağıdakileri içermelidir

    Manifest-Version: 1.0
    Created-By: <JDK Version> (Oracle Corporation)
    Main-Class: testpackage.Test

    Manifestinizi elle düzenlerseniz , yeni satırı sonuna kadar tuttuğunuzdan emin olun, aksi takdirde java bunu tanımaz.

  5. İle .jardosyanızı yürütün

    java -jar test.jar

1
Cevabınızın 4. adımı çok önemlidir! Manifestim bu satırsonu nedeniyle işe yaramıyordu. Bu konuda ziyaret ettiğim tüm cevaplar (çok) bundan bahsetmedi ve maven, karınca, kepçe vb. Kullanmayan herkes için zorunludur.
Maude

1
@Maude geri bildiriminiz için teşekkür ederiz. Bu yüzden cevabı satırsonu ipucu ile kalın bir şekilde ekledim . Bunu otomatik olarak oluşturulan bir manifest ile karşılaştırarak öğrenene kadar günler aradım.
CodeMonkey

Hah, teşekkürler. Sadece yeni satırda kafama vuruyordum.
Richard Thomas

5

Şahsen buradaki tüm cevapların soruyu yanlış anladığını düşünüyorum. Bunun cevabı, bahar önyüklemesinin .jar'ı nasıl oluşturduğu farkında yatıyor. Herkes, Spring Boot'un böyle bir tezahür oluşturduğunu bilir, bu da herkesin bunun standart bir .jar lansmanı olduğu varsayımından farklı olabilir:

Start-Class: com.myco.eventlogging.MyService
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_131
Main-Class: org.springframework.boot.loader.JarLauncher

Belki de org.springframework.boot.loader.JarLaunchersınıf yolunda idam edilmesi gerekir ?


Kulağa umut verici geliyor. Sınıf yoluna tam olarak nasıl JarLauncher eklersiniz?
MarkHu

4

Yürütülebilir herhangi bir jar dosyası java -jar app.jar gibi komut istemi kullanılarak tıklatılarak veya çalıştırılarak çalıştırılmalıdır (jar yolunda boşluk varsa "kullanın - yani java -jar" C: \ klasör adı \ app.jar "). Yürütülebilir kavanozunuz çalışmıyorsa, bu düzgün bir şekilde oluşturulmadığı anlamına gelir.

Daha iyi anlamak için, jar dosyasını ayıklayın (veya herhangi bir aracı kullanarak görüntüleyin, Windows 7-Zip için iyidir) ve /META-INF/MANIFEST.MF altındaki dosyayı kontrol edin. Gibi bir giriş bulursanız

Ana Sınıf: paketiniz.adi.ClaaswithMain - o zaman sorun değil, aksi takdirde sağlamanız gerekir.

MANIFEST.MF dosyasına Ana Sınıf girişini eklediğinizi unutmayın, nereye kaydettiğinizi kontrol edin!


4

Basitçe bu adımı takip edebilirsiniz.

 jar -cfm jarfile-name manifest-filename Class-file name

Kavanoz dosyasını çalıştırırken böyle basit bir şekilde çalıştırın

 java -cp jarfile-name main-classname

4

Jar dosyasını düzgün oluşturmamış olabilirsiniz:

örnek: kavanoz oluşturmada m seçeneği eksik

Aşağıdaki işler:

jar -cvfm MyJar.jar Manifest.txt *.class

4

.Jar birleştirmek için komut satırını kullanıyorsanız, Manifest dosyası eklemeden ana öğeyi işaret etmek mümkündür. Misal:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(param "e" bunu yapar: TheNameOfClassWithMainMethod, main () ve app.jar yöntemiyle sınıfın adıdır - çalıştırılabilir .jar ve * .class adı - birleştirilecek tüm sınıf dosyaları)


3

Benim için bu hata sadece Eclipse basit bir kütüphane kavanoz dosyası değil çalıştırılabilir bir jar dosyası istediğini unuttum çünkü oluştu. Eclipse'de jar dosyasını oluşturduğunuzda, sağ radyo düğmesini tıkladığınızdan emin olun.


3

Yukarıdaki cevaplar benim için sadece kısmen yardımcı oldu. java -cpcevabın bir parçasıydı, ancak çalıştırılacak sınıfı nasıl belirleyeceğime dair daha spesifik bilgilere ihtiyacım vardı. İşte benim için işe yarayan:

1.Adım: Çalıştırmam gereken sınıfı bulun

jar tf /path/to/myjar.jar | more

Sonucun en üst satırları:

META-INF/
META-INF/MANIFEST.MF
somepath/
somepath/App.class
META-INF/maven/
...

App.class çalıştırılacak ana sınıfı içeriyordu. İhtiyacınız olan sınıfın her zaman birincisi olduğunu varsayabilirseniz% 100 emin değilim, ama bu benim içindi. Değilse, sınıf listesini yönetilebilir bir boyuta sığdırmak için kitaplık ile ilgili sonuçları hariç tutmak için grep kullanmanın çok zor olmadığını düşünürdüm.

Oradan kolay oldu: Ben sadece bu yolu (eksi ".class" soneki) kullanın:

java -cp /path/to/myjar.jar somepath/App

Her zaman birinci sınıf değildir. Neredeyse hiç. Komut satırı olmalıdır java -cp ... somepackage.App.
user207421

2

MANIFEST.MF'yi eklediğiniz için, bu dosyada Alan sırasını göz önünde bulundurmanız gerektiğini düşünüyorum. Benim env java version "1.8.0_91"

ve MANIFEST.MF'm burada olduğu gibi

// MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_91 (Oracle Corporation)
Main-Class: HelloWorldSwing

// run
~ java -jar HelloWorldSwing.jar
no main manifest attribute, in HelloWorldSwing.jar

Ancak, bu aşağıdaki gibi geçiyor

Manifest-Version: 1.0
Main-Class: HelloWorldSwing
Created-By: 1.8.0_91 (Oracle Corporation)

//this run swing normally

Eh? Emir önemsizdir. Ne iddia ettiğinizi netleştirin.
user207421

2

(ilk gönderi - bu yüzden temiz olmayabilir)

Bu, OS X 11.6, Maven tabanlı Netbeans 8.2 programı için düzeltmem. Şimdiye kadar benim app% 100 Netbeans - hiçbir tweaking (imkansız için sadece birkaç kabuk kaçar!).

Burada ve başka yerlerde cevapların çoğunu boşuna denedikten sonra, "işe yarayanı kullan" sanatına geri döndüm.

Buradaki en iyi cevap ( olivier-refalo thanx) başlamak için doğru yere benziyordu ama yardımcı olmadı.

İşe yarayan diğer projelere baktığımda, tezahür hatlarında küçük farklılıklar fark ettim:

  1. addClasspath, classpathPrefix yoktu (silindi)
  2. mainClass'ta "com" eksikti. (NB -> Proje Özellikleri-> Çalıştır-> Ana Sınıf-> Belirtmek için göz atın)

Neden (java'ya sadece 3 ay) ya da nasıl olduğundan emin değilim, ama sadece bunun işe yaradığını söyleyebilirim.

İşte sadece değiştirilmiş manifest bloğu:

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>

2

Kötü tezahür nesline yeni bir çözüm buldum!

  1. Jar dosyasını WinRAR gibi bir zip düzenleyicisiyle açın
  2. META-INF için tıklayınız

  3. Ekle veya düzenle

    • Ekle:

      • META-INF adlı bir klasörde MANIFEST.MF adlı bir metin dosyası oluşturun ve aşağıdaki satırı ekleyin:

        • Bildirim Sürümü: 1.0
        • Ana Sınıf: package.ex.com.views.mainClassName
      • Dosyayı kaydedin ve zip dosyasına ekleyin

    • Düzenle:

      • Önceki satırı eklemek için MANIFEST.MF dosyasını değiştirerek dosyayı sürükleyin
  4. Cmd'yi açın ve şunu yazın: java -jar c: /path/JarName.jar

Şimdi iyi çalışmalı!


2

çözümlerin çoğu benim için işe yaramadı ama benim eğitmen bana yardımcı oldu ben burada onun çözüm paylaşmak istiyorum kali linux terminali kullanılan ama tüm debian iyi olmalı

javac *.java
nano MANIFEST.MF

dosya türünde

Ana Sınıf: Ana veya ana dosya adınız ne olursa olsun (varsa paket adını eklediğinizden emin olun)

jar -cvmf MANIFEST.MF new.jar *.class

şimdi dosyayı çalıştırmak için

java -jar new.jar

veya dosya özelliklerine gidip kontrol edebilirsiniz

Dosyanın program olarak yürütülmesine izin ver

üzerine çift tıkla

yukarıdaki cevapların çoğu,


1

Benimkiyle aynı problemin olabilir. .Jar dosyanızı oluşturduktan sonra yazın jar xf app.jar META-INF/MANIFEST.MF. Bu, dosyayı okuyabilmeniz için geçerli dizininize bir kopyasını oluşturur. Sadece şöyle bir şey söylüyorsa:

Bildirim Sürümü: 1.0

Oluşturan kişi: 1.8.0_51 (Oracle Corporation)

ve "Ana Sınıf" bildirimini içermiyorsa, sorununuzu bulduğunuzu düşünüyorum.

Yine de nasıl çözüleceğini bilmiyorum. StackOverflow aynı / benzer sorunları olan diğer insanları kontrol ve bir cevap bulamadım. Ancak bu bilgilerle belki daha iyi yardım alabilirsiniz (benimle aynı sorunun olduğu göz önüne alındığında).

Düzenleme: Bir manifest dosyası ile denedim ama işe yaramadı, ama benim hatam jar dosyası oluştururken sadece sınıflardan birini adlandırmak oldu. Bunun yerine * .class yazdım ve şimdi çalışıyor.

Rağmen neden bir manifest dosyası oluşturmak için bir ihtiyaç olduğunu bilmiyorum. Ama sanırım işe yaradığı sürece iyi.


1

Bu sorunu yaşadım ve Netbeans 8'de bunu yaparak yakın zamanda çözdüm (aşağıdaki resme bakın):

Netbeans proje özellikleri

  1. projenizin özelliklerine gidin .
  2. Çalıştır'a tıklayın .
  3. kullanarak projenin ana sınıf belirtmek gözatmasını .
  4. Jar dosyasını oluşturun ve çalıştırın .
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.