Saya telah menginstal aplikasi, ketika saya mencoba untuk menjalankan hal (hal's executable jar) tidak terjadi apa-apa. Ketika saya menjalankannya dari baris perintah dengan:
java -jar "app.jar"
Saya mendapatkan pesan berikut:
tidak utama mewujudkan atribut, di "app.jar"
Biasanya, jika saya telah menciptakan program sendiri, saya akan menambahkan sebuah kelas utama atribut file manifes. Tapi dalam kasus ini, karena file dari sebuah aplikasi, saya tidak bisa melakukan itu. Saya juga mencoba mengekstrak jar untuk melihat apakah saya bisa menemukan kelas utama, tetapi ada banyak kelas dan tidak satupun dari mereka memiliki kata "main" di's nama. Harus ada cara untuk memperbaiki hal ini karena program ini berjalan dengan baik pada sistem lain.
Pertama, it's agak aneh, untuk melihat anda menjalankan java -jar "app"
dan java -jar app.jar
Kedua, untuk membuat executable jar... yang anda butuhkan untuk jar file bernama META-INF/MANIFEST.MF
file itu sendiri harus memiliki (setidaknya) satu ini kapal:
Main-Class: com.mypackage.MyClass
Di mana com.mypackage.MyClass
adalah kelas memegang public static void main(String[] args) entry point.
Perhatikan bahwa ada beberapa cara untuk mendapatkan ini dilakukan baik dengan CLI, Maven, Semut atau Gradle:
Untuk CLI, perintah berikut ini akan melakukan: (tks @dvvrt)
jar cmvf META-INF/MANIFEST.MF <baru-jar-nama file>.jar <file untuk mencakup>
Untuk Maven, sesuatu seperti berikut cuplikan harus melakukan trik. Catatan bahwa ini hanya plugin definisi, tidak penuh pom.xml:
<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>
(Memilih <version>
yang tepat untuk proyek anda.)
Untuk Ant, cuplikan di bawah ini bisa 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 Perry Rhodan -
Untuk Gradle:
plugins {
id 'java'
}
jar {
manifest {
attributes(
'Main-Class': 'com.mypackage.MyClass'
)
}
}
Yang seharusnya java -jar app.jar
bukan java -jar "app"
.
The jar
pilihan hanya bekerja jika file JAR adalah file executable JAR file, yang berarti itu harus memiliki sebuah file manifest dengan Main-Class
atribut di dalamnya. Lihat Kemasan program-Program dalam File JAR untuk belajar bagaimana untuk membuat executable JAR.
Jika itu's tidak executable JAR, kemudian anda'll perlu untuk menjalankan program dengan sesuatu seperti:
java -cp app.jar com.somepackage.SomeClass
di mana com.somepackage.SomeClass
adalah kelas yang berisi utama
metode untuk menjalankan program. (Apa itu kelas tergantung pada program, it's tidak mungkin untuk mengatakan dari informasi yang anda've disediakan).
Atau, anda dapat menggunakan maven-perakitan-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 ketergantungan guci sebagaimana ditentukan dalam
Itu karena Java tidak bisa menemukan atribut Utama dalam MANIFEST.MF file. Atribut Utama adalah perlu untuk memberitahu jawa kelas mana yang harus digunakan sebagai aplikasi's entry point. Di dalam file jar, MANIFEST.MF file ini terletak di META-INF. Bertanya-tanya bagaimana anda bisa melihat apa yang's dalam file jar? Buka file jar dengan WinRAR.
Atribut utama dalam MANIFEST.MF terlihat seperti ini:
Main-Class: <packagename>.<classname>
Anda mendapatkan ini "tidak ada utama mewujudkan atribut" kesalahan saat ini line hilang dari TERWUJUD.MF file.
<menyerang>It's benar-benar kekacauan besar untuk menentukan atribut ini dalam MANIFEST.MF file.</strike>Update: saya baru saja menemukan sebuah cara yang sangat rapi untuk menentukan Aplikasi's entry point di eclipse. 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.
Untuk maven, ini adalah apa soal itu (bagi saya, untuk Veetle basis kode pada 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>
Cheers...
Aku punya masalah ini ketika membuat botol menggunakan IntelliJ IDEA. Lihat diskusi ini.
Apa soal itu bagi saya adalah untuk kembali membuat jar artefak, memilih JAR > Dari modul-modul dengan dependensi, tetapi tidak menerima default Direktori untuk META-INF/MANIFEST.MF. Perubahan itu dari -/src/main/java untuk -/src/main/resources.
Jika tidak, itu termasuk sebuah file manifest dalam tabung, tetapi tidak satu di -/src/main/java yang seharusnya.
Coba perintah ini untuk memasukkan tabung:
java -cp yourJarName.jar your.package..your.MainClass
Saya memiliki masalah yang sama. dengan menambahkan baris berikut ke pom file yang membuatnya bekerja. Plugin ini akan memastikan proses membangun aplikasi anda dengan semua langkah yang diperlukan.
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Bagi saya, tidak ada jawaban yang benar-benar membantu - saya punya file manifest di tempat yang benar, yang mengandung Main-Kelas dan semuanya. Apa yang tersandung saya selama ini:
Peringatan: file teks yang anda membuat manifest harus diakhiri dengan baris baru atau carriage return. Baris terakhir tidak akan diurai dengan baik jika tidak diakhiri dengan baris baru atau carriage return.
(sumber). Menambahkan baris baru pada akhir menampakkan tetap itu.
Aku punya kesalahan yang sama sekarang.
Jika u're menggunakan gradle
, hanya menambahkan satu di ur gradle.membangun
:
apply plugin: 'java'
jar {
manifest {
attributes 'Main-Class': 'com.company.project.MainClass'
}
}
Di mana com.perusahaan.proyek.MainClass
path untuk ur kelas dengan public static void main(String[] args)
metode.
Jika menggunakan Maven, seperti berikut 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>
Saya menghadapi masalah yang sama dan itu's diperbaiki sekarang:) Cukup ikuti langkah-langkah di bawah ini dan kesalahan bisa untuk apa-apa, tapi di bawah ini langkah-langkah membuat proses lebih halus. Saya menghabiskan banyak waktu untuk menemukan memperbaiki.
1.Mencoba me-restart Eclipse (jika anda menggunakan Eclipse untuk membangun file JAR) --> ini benar-Benar membantu masalah saya dalam mengekspor file JAR dengan benar.
2.Setelah gerhana restart, cobalah untuk melihat apakah anda eclipse mampu mengenali kelas utama/metode dengan proyek Java --> klik kanan --> Run as --> Jalankan konfigurasi --> Utama --> klik tombol Cari untuk melihat apakah anda eclipse mampu lookup untuk kelas utama dalam file JAR. --> Ini adalah untuk validasi bahwa file JAR akan memiliki entry point untuk kelas utama.
Setelah ini, ekspor Jawa Dinamis proyek sebagai "Runnable JAR" file dan file JAR.
Di Jawa meluncurkan konfigurasi, pilih kelas utama.
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.kelas-kelas.TCRuleAudit
Anda mungkin menghadapi didukung versi java error. memperbaiki mengubah java_home di shell bash profil untuk mencocokkan versi java yang digunakan untuk mengkompilasi project di eclipse.
Harap ini membantu! Mohon beritahu saya jika anda masih memiliki masalah.
Saya pribadi berpikir semua jawaban di sini adalah mis-understanding pertanyaan. Jawaban untuk ini terletak pada perbedaan cara semi-boot membangun .jar. Semua orang tahu bahwa musim Semi Boot set up terwujud seperti ini, yang bervariasi dari everyones asssumption bahwa ini adalah standar .jar peluncuran, yang mungkin atau mungkin tidak menjadi :
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 itu perlu dijalankan dengan org.springframework.boot.loader.JarLauncher
pada classpath?
Aku punya masalah yang sama. Banyak solusi yang disebutkan di sini tidak't berikan seluruh gambar, sehingga saya'll mencoba untuk memberikan ringkasan tentang bagaimana untuk pak jar file dari baris perintah.
.kelas
file-file dalam paket, tambahkan paket di awal .jawa
.Test.java
paket testpackage;
public class Test { ... }
.kelas
file yang berakhir dengan struktur yang diberikan oleh nama paket digunakan:javac -d . Test.java
The -d .
membuat compiler membuat struktur direktori yang anda inginkan.
.jar
file, anda perlu untuk menginstruksikan jar rutin pada bagaimana untuk berkemas. Di sini kita menggunakan opsi set cvfeP
. Ini adalah untuk menjaga struktur paket (opsi P
), menentukan entry point sehingga terwujud file yang berisi informasi yang bermakna (opsi e
). Opsi f
memungkinkan anda menentukan nama file, opsi c
menciptakan arsip dan opsi v
set output verbose. Hal-hal penting untuk dicatat di sini adalah P
dan e
.Kemudian muncul nama jar yang kita inginkan test.jar
.
Kemudian datang entry point
Dan kemudian datang -C . <packagename>/
untuk mendapatkan kelas file dari folder itu, melestarikan struktur folder.
jar cvfeP test.jar testpackage.Tes -C . testpackage/
.jar
file yang di zip program. Ini harus memiliki struktur sebagai berikuttest.jar
META-INF | MANIFEST.MF testpackage | Test.class
MANIFEST.MF harus berisi sebagai berikut
Manifest-Version: 1.0
Dibuat Oleh:
Jika anda mengedit manifest dengan tangan pastikan untuk menyimpan baris baru pada akhir jika jawa doesn't mengenalinya.
.jar
file denganjava -jar test.jar
Anda mungkin tidak telah membuat file jar dengan benar:
ex: hilang opsi m di jar penciptaan
Pekerjaan-pekerjaan sebagai berikut:
jar -cvfm MyJar.jar Manifest.txt *.class
Setiap executable jar file Harus berjalan baik dengan mengklik atau menjalankan menggunakan command prompt seperti java jar app.jar (gunakan "jika jalan jar berisi ruang" - yaitu java -jar "C:\folder nama\app.jar"). Jika anda executable jar tidak berjalan, yang berarti itu tidak dibuat dengan benar.
Untuk pemahaman yang lebih baik, ekstrak file jar (atau lihat menggunakan alat apapun, untuk windows 7-Zip adalah bagus) dan memeriksa file di bawah /META-INF/MANIFEST.MF. Jika anda menemukan entri seperti
Main-Class: anda.paket.nama.ClaaswithMain - maka's baik-baik saja, jika tidak, anda harus memberikan itu.
Menyadari menambahkan Utama di Kelas entry pada MANIFEST.MF file, memeriksa di mana anda menyimpannya!