Tidak dapat menjalankan file jar: “no atribut manifes utama”

971

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.

Ewoud
sumber
Cari metode utama; Anda tidak dapat mengandalkan nama kelas.
Dave Newton
2
Saya tahu, tetapi karena saya hanya memiliki file .class saya tidak bisa melihat metodenya. Atau bisakah saya?
Ewoud
Anda tidak benar-benar mengetik tanda kutip, bukan? Bagaimanapun, ada sejumlah cara untuk melihat metode, termasuk menggunakan javap. Anda mungkin ingin melepaskannya dan melihat apakah sebenarnya tidak ada manifes.
Dave Newton
Terkait: dengan dependensi: stackoverflow.com/a/23986765/360211
weston
bagaimana jika saya tidak memiliki kelas utama karena saya menjalankan kode menggunakan CommandLineJobRunner
Kamini

Jawaban:

946

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:

Main-Class: com.mypackage.MyClass

Di mana com.mypackage.MyClasskelas 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 :

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

(Pilih a <version> sesuai dengan proyek Anda.)

Untuk Ant , cuplikan di bawah ini akan membantu:

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

Kredit Michael Niemand -

Untuk Gradle :

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}
Olivier Refalo
sumber
15
Di Semutnya <manifest> <atribut name = "Main-Class" value = "com.mypackage.MyClass" /> </manifest> di dalam elemen <jar>
Michael Niemand
1
Terima kasih. Hanya ingin menambahkan bahwa Anda dapat menyalin dependensi ke folder lib menggunakan ini: stackoverflow.com/a/996915/1121497 . Karena classpath menyertakan libfolder itu, maka Anda hanya perlu menjalankan toples java -jar myproject.jardan akan menemukan dependensinya.
Ferran Maylinch
4
BAGAIMANA "jar file bernama META-INF / MANIFEST.MF"? Saya memiliki .jar di satu sisi dan .MF di sisi lain, bagaimana cara menghubungkannya? Saya meletakkan manifes di folder yang sama dengan .jar tetapi tidak berhasil, saya masih mendapatkan masalah!
Wicelo
4
@Wicelo Untuk menentukan file MANIFEST.MF tertentu saat membuat file jar menggunakan flag m for jar. misalnya. jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
dvvrt
1
Catatan: Untuk Maven, saya sudah memiliki maven-jar-pluginitem dalam file Maven yang dihasilkan VSC, jadi saya baru saja menambahkan <configuration>bagian itu.
Aaron Franke
279

Seharusnya itu java -jar app.jarbukanjava -jar "app" .

The -jarpilihan hanya bekerja jika file JAR adalah file JAR executable, yang berarti ia harus memiliki file manifest dengan Main-Classatribut 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:

java -cp app.jar com.somepackage.SomeClass

di mana com.somepackage.SomeClasskelas yang berisi mainmetode untuk menjalankan program. (Apa kelas itu tergantung pada program, tidak mungkin untuk mengetahui dari informasi yang Anda berikan).

Jesper
sumber
3
terima kasih atas balasan Anda, tetapi solusi Anda hanya berfungsi jika saya tahu nama kelas yang berisi metode utama. Dan itu salah ketik ... Seharusnya "app.jar". Tetapi bagaimana Anda menjelaskan mengapa ini berjalan pada sistem lain hanya dengan mengklik dua kali file tersebut?
Ewoud
Jika memang itu adalah JAR yang dapat dieksekusi, Anda dapat mengekstrak file manifes (itu ada di META-INFdirektori di dalam file JAR). Seharusnya berisi Main-Classatribut yang memberi Anda nama kelas utama.
Jesper
Jika tidak berjalan pada satu sistem, maka sistem itu mungkin memiliki versi Java yang terlalu lama. Jika JAR misalnya dikompilasi dengan Java 7, maka Anda tidak dapat menjalankannya pada sistem yang memiliki Java 6 atau lebih lama.
Jesper
Itu lucu karena sistem lain menjalankan win7 dan pc ini dengan masalah berjalan win8.
Ewoud
2
@Jesper Halo, bagaimana jika eclipse menggunakan paket default? Apakah saya hanya memasukkan nama kelas?
Ogen
127

Atau, Anda dapat menggunakan maven-assembly-plugin, seperti yang ditunjukkan pada contoh di bawah ini:

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

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.

CodeBrew
sumber
3
Sempurna, ini berhasil. Ini bundel semua dependensi ke dalam satu stoples, sehingga memungkinkan Anda untuk mengkompilasi / membangun proyek dan menjalankannya di luar kotak.
Paul
2
Dalam konteks plugin teduh , kita harus mengikuti bantuan di Executable JAR .
koppor
3
Ini maven-assembly-pluginberhasil. maven-jar-plugintidak.
Martynas Jusevičius
Catatan: letakkan kode ini di pom.xmlfile 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!
Kirill Karmazin
Saya benar-benar berjuang dengan masalah ini ... Ini bekerja dengan sempurna. Terima kasih!
jmojico
60

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:

Main-Class: <packagename>.<classname>

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,

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.

masukkan deskripsi gambar di sini

Sasanka Panguluri
sumber
32

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.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
Naga Srinu Kapusetti
sumber
2
berfungsi dengan baik, tetapi pertimbangkan untuk menambahkan versi pada April 2018 <plugin> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-maven-plugin </artifactId> <version> 2.0.1.RELEASE < / version> </plugin>
Tenflex
Maaf tapi itu bukan solusi karena dia tidak berbicara tentang Spring Boot, itu masalah umum dengan eksekusi jar :)
LAMRIN TAWSRAS
Terima kasih banyak, ini memecahkan masalah untuk booting musim semi!
AleksandarT
Saya bekerja pada pegas boot 2.2.0. Lepaskan. Sayangnya, solusi ini tidak berhasil untuk saya. Namun, ini berfungsi ketika Anda merujuk dari <parent>...</parent>aplikasi di pom.xml. Dugaan saya adalah, jika kita mengunjungi parentpom.xml aplikasi, kita akan mendapatkan ide yang jelas.
tusar
Saya akhirnya memecahkan masalah saya dengan kebiasaan repackage-classifier. Silakan kunjungi docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…
tusar
30

Jawaban Gradle adalah menambahkan pengaturan toples / manifest / atribut seperti ini:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}
QED
sumber
1
jawaban paling sederhana sejauh ini.
lasec0203
29

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.

Bintang fajar
sumber
Ini bekerja untuk saya dengan IDEA 14.1.6. Saya juga menambahkan properti build untuk pom.xml tetapi tidak berpengaruh. Tapi jawaban Anda menyelesaikannya, terima kasih.
lsrom
3
Terima kasih telah menyelamatkan desktop saya dari penyok oleh frustrasi murni karena tidak ada yang berfungsi;) Tautan Anda tampaknya rusak, tetapi saya dapat mengonfirmasi bahwa ini berfungsi dengan baik. Diuji dengan IntelliJ IDEA 2018.2.5 (Edisi Komunitas)
Matthias Bö
mengkonfirmasi bahwa ini berfungsi, walaupun saya tidak memiliki direktori / resources
lxknvlk
28

Untuk pakar, inilah yang memecahkannya (bagi saya, untuk basis kode Veetle di GitHub):

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

Bersulang...

Dave
sumber
Saya menemukan ini berhasil tetapi saya harus menjalankan karena mvn package shade:shademenjalankan mvn packagetidak memicu plugin teduh untuk berjalan.
Raystorm
24

Coba perintah ini untuk memasukkan toples:

java -cp yourJarName.jar your.package..your.MainClass
Burhan ARAS
sumber
1
Salah satu caranya adalah dengan memasukkan kelas utama dalam pom.xml dan menggunakan perintah java -jar, yang lain adalah dengan menggunakan perintah java -cp.
Gaurav Khare
15

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:

Peringatan: File teks dari mana Anda membuat manifes harus diakhiri dengan baris baru atau carriage return. Baris terakhir tidak akan diuraikan dengan benar jika tidak diakhiri dengan baris baru atau carriage return.

( sumber ). Menambahkan baris baru di akhir manifes memperbaikinya.

eis
sumber
11

Jika menggunakan Maven, termasuk mengikuti di pom

<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>
shuang
sumber
3
Siapa bilang ini adalah proyek Spring Boot?
james.garriss
2
@ james.garriss baik saya akan mengatakan, saya datang ke posting ini mencari no main manifest attributekesalahan tapi saya bekerja pada aplikasi boot musim semi jadi jawaban ini membantu saya. Saya sudah tahu cara membuat META-INF/MANIFEST.MFfile, tetapi tidak bagaimana membuat spring-boot secara otomatis menanganinya.
Vishrant
5
Saya tidak melihat alasan untuk menurunkan jawaban ini. Jika Anda tidak menggunakan, spring-bootabaikan saja. Stackoverflow juga membantu membangun repositori masalah Anda sendiri yang Anda hadapi saat pemrograman.
Vishrant
@Vishrant Saya tidak tahu tentang orang lain tetapi saya downvoted karena jawaban ini tidak menjawab pertanyaan seperti yang diajukan. Mungkin saja itu terjadi untuk menjawab pertanyaan Anda, tetapi pertanyaan Anda tidak benar-benar apa yang ditanyakan.
Bane
@Bane yakin. tetapi pertanyaan dapat diambil dalam arti luas dan jawaban ini berlaku untuk itu dan dapat membantu orang lain dalam arti ketika mereka akan menggunakan booting musim semi.
Vishrant
10

Saya memiliki masalah yang sama hari ini. Masalah saya terpecahkan ketika saya memindahkan META-INF ke folder resources.

MTA
sumber
Ini juga berhasil bagi saya. Cobalah jika Anda menggunakan Jetbrains IntelliJ
NickSoft
Terima kasih, itu benar-benar berhasil untuk saya :)
Syed Mehtab Hassan
Ini bekerja untuk saya juga di Intellij. Terima kasih kawan
Waqas
10

Saya mendapat kesalahan yang sama tadi. Jika Anda menggunakan gradle, tambahkan saja berikutnya di ur gradle.build:

apply plugin: 'java'

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

Di mana com.company.project.MainClassjalan ke kelas Anda dengan public static void main(String[] args)metode.

Binakot
sumber
Ini membantu saya! tutorial gradle telah ditentukan menggunakan mainClassNameset variabel level atas , tetapi itu hanya membantu dengan gradle runperintah, bukan dengan membuat file .jar
kevlarr yang
8

Masalah 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! .

  1. Ubah nama yourjar.jar menjadi yourjar.zip
  2. Buka file MANIFEST.MF dari META-INF \ MANIFEST.MF
  3. 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)

  4. Ganti konten MANIFEST.MF dari youjar.zip dengan itu.

  5. Ganti nama yourjar.zip menjadi yourjar.jar kembali.
  6. Sekarang java -jar yourjar.jar bekerja dengan sempurna.

ATAU!

Sederhana, buat sendiri MANIFEST.MF dan:

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

Tetapi jika Anda menggunakan panel maven (atau baris perintah maven), Anda bisa memaksanya untuk membuat manifes sendiri dan memasukkannya ke dalam file JAR.

  1. Tambahkan ke bagian build you pom.xml kode ini:

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

Yury Finchenko
sumber
5

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.

  1. Setelah ini, ekspor proyek Java Dynamic Anda sebagai file "Runnable JAR" dan bukan file JAR.

  2. Dalam konfigurasi peluncuran Java, pilih kelas utama Anda.

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

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

KarthikPon
sumber
5

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 .

  1. Jika Anda ingin memiliki .classfile Anda dalam paket, tambahkan paket di awal .java.

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
  2. Untuk mengkompilasi kode Anda dengan .classfile Anda berakhir dengan struktur yang diberikan oleh nama paket gunakan:

    javac -d . Test.java

    The -d .membuat compiler membuat struktur direktori yang Anda inginkan.

  3. Saat mengemas .jarfile, Anda perlu menginstruksikan toples rutin tentang cara mengemasnya. Di sini kita menggunakan set opsi cvfeP. Ini untuk menjaga struktur paket (opsi P), tentukan titik masuk sehingga file manifes berisi informasi yang bermakna (opsi e). Opsi fmemungkinkan Anda menentukan nama file, opsi cmembuat arsip dan opsi vmengatur output untuk verbose. Hal penting yang perlu diperhatikan di sini adalah Pdane .

    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.

    jar cvfeP test.jar testpackage.Test -C . testpackage/
  4. Periksa .jar file di program zip. Seharusnya memiliki struktur berikut

    test.jar

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

    MANIFEST.MF harus berisi yang berikut ini

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

    Jika Anda mengedit manifes Anda dengan tangan, pastikan untuk menjaga baris baru di akhir jika tidak java tidak mengenalinya.

  5. Jalankan .jarfile Anda dengan

    java -jar test.jar
CodeMonkey
sumber
1
Langkah ke-4 dari jawaban Anda sangat penting! Manifes saya tidak berfungsi karena baris baru itu pada akhirnya saya tidak tahu saya harus meletakkannya. Semua jawaban yang saya kunjungi pada topik ini (banyak) tidak menyebutkan ini, dan itu wajib bagi siapa pun yang tidak menggunakan pakar, semut, gradle, dan sebagainya.
Maude
1
@ Maude terima kasih atas umpan baliknya. Itulah mengapa saya menambahkan jawaban dengan petunjuk baris baru dengan huruf tebal . Saya mencari selama berhari-hari sampai saya menemukan ini dengan membandingkan dengan manifes yang dibuat secara otomatis.
CodeMonkey
Hah terima kasih. Saya hanya membenturkan kepala saya pada hal baris baru itu.
Richard Thomas
5

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:

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

Mungkin perlu dieksekusi dengan org.springframework.boot.loader.JarLauncherdi classpath?

Djangofan
sumber
Ini kedengarannya menjanjikan. Bagaimana tepatnya Anda menambahkan JarLauncher ke classpath?
MarkHu
4

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!

Shekh Akther
sumber
4

Anda Bisa Cukup ikuti langkah ini. Buat file jar menggunakan

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

Saat menjalankan file jar jalankan sederhana seperti ini

 java -cp jarfile-name main-classname
Koneri
sumber
4

Anda mungkin tidak membuat file jar dengan benar:

mis: opsi yang hilang m dalam pembuatan toples

Karya-karya berikut:

jar -cvfm MyJar.jar Manifest.txt *.class
satheesh.v
sumber
4

Jika Anda menggunakan baris perintah untuk merakit .jar dimungkinkan untuk menunjuk ke utama tanpa menambahkan file Manifest. Contoh:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

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

Andrey
sumber
3

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

Neeraj Bhatnagar
sumber
3

Jawaban di atas hanya membantu saya. java -cpadalah 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

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

Baris teratas dari hasilnya adalah:

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

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"):

java -cp /path/to/myjar.jar somepath/App
mwag
sumber
Tidak selalu kelas satu. Hampir tidak pernah. Baris perintah seharusnya java -cp ... somepackage.App.
Marquis of Lorne
2

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

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

Namun, ini seperti di bawah ini dijalankan

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

//this run swing normally
Fan Yer
sumber
Eh? Perintahnya tidak penting. Tidak jelas apa yang Anda klaim.
Marquis of Lorne
2

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

  1. addClasspath, classpathPrefix tidak ada (dihapus)
  2. mainClass tidak memiliki "com." (menggunakan NB -> Project Properties-> Run-> Main Class-> Browse untuk menentukan)

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:

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>
MichaelT
sumber
2

Saya menemukan solusi baru untuk generasi manifes buruk!

  1. Buka file jar dengan editor zip seperti WinRAR
  2. Klik untuk META-INF

  3. Tambah atau edit

    • Menambahkan:

      • Buat file teks yang disebut MANIFEST.MF dalam folder bernama META-INF dan tambahkan baris berikut:

        • Versi Manifes: 1.0
        • Kelas Utama: package.ex.com.views.mainClassName
      • Simpan file dan tambahkan ke zip

    • Edit:

      • Seret file keluar, ubah MANIFEST.MF untuk menambahkan baris sebelumnya
  4. Buka cmd dan ketik: java -jar c: /path/JarName.jar

Seharusnya bekerja dengan baik sekarang!

Dave Beauchesne
sumber
2

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

javac *.java
nano MANIFEST.MF

dalam tipe file

Kelas Utama: Utama atau apa pun nama file utama Anda (pastikan untuk menambahkan nama paket jika ada)

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

sekarang untuk menjalankan penggunaan file

java -jar new.jar

atau Anda dapat pergi ke properti file dan memeriksa

Izinkan Eksekusi file sebagai program

klik dua kali di atasnya

itu membantu saya sementara sebagian besar jawaban di atas tidak


sumber
1

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:

Versi Manifes: 1.0

Dibuat-Oleh: 1.8.0_51 (Oracle Corporation)

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.

Polisi
sumber
1

Saya memiliki masalah ini dan saya menyelesaikannya baru-baru ini dengan melakukan ini di Netbeans 8 (Lihat gambar di bawah):

Properti proyek Netbeans

  1. buka properti proyek Anda.
  2. klik Jalankan .
  3. tentukan kelas utama proyek Anda menggunakan browse .
  4. membangun dan menjalankan file Jar.
Abdelsalam Shahlol
sumber