Saya menggunakan Maven di aplikasi mandiri saya, dan saya ingin mengemas semua dependensi dalam file JAR saya di dalam folder library, seperti yang disebutkan dalam salah satu jawaban di sini:
Bagaimana cara membuat JAR yang dapat dieksekusi dengan dependensi menggunakan Maven?
Saya ingin file JAR terakhir saya memiliki folder library yang berisi dependensi sebagai file JAR, tidak seperti maven-shade-plugin
yang menempatkan dependensi dalam bentuk folder seperti hierarki Maven di folder .m2.
Sebenarnya konfigurasi saat ini melakukan apa yang saya inginkan, tetapi saya mengalami masalah dengan memuat file JAR saat menjalankan aplikasi. Saya tidak dapat memuat kelas.
Inilah konfigurasi saya:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.myapp.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>install</id>
<phase>install</phase>
<goals>
<goal>sources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
Proyek ini berjalan dengan baik dari Eclipse, dan file JAR dimasukkan ke dalam folder perpustakaan di dalam file JAR terakhir saya seperti yang saya inginkan, tetapi ketika menjalankan file JAR terakhir dari folder target saya selalu mendapatkan ClassNotFoundException
:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.myapp.MainClass. Program will exit.
Bagaimana cara memperbaiki pengecualian ini?
sumber
com.myapp.MainClass
sedang dicari, bukancom.tastycafe.MainClass
.Jawaban:
Berikut ini adalah solusi saya. Uji jika itu berhasil untuk Anda:
Plugin pertama meletakkan semua dependensi di folder target / class / lib, dan yang kedua menyertakan folder library di file JAR terakhir, dan mengonfigurasi
Manifest.mf
file.Tetapi kemudian Anda perlu menambahkan kode pemuatan kelas khusus untuk memuat file JAR.
Atau, untuk menghindari pemuatan kelas kustom, Anda dapat menggunakan "$ {project.build.directory} / lib, tetapi dalam kasus ini, Anda tidak memiliki dependensi di dalam file JAR final, yang mengalahkan tujuan.
Sudah dua tahun sejak pertanyaan itu diajukan. Masalah file JAR bersarang tetap ada. Saya harap ini membantu seseorang.
sumber
Diperbarui:
sumber
Cara paling sederhana dan paling efisien adalah dengan menggunakan plugin uber seperti ini:
Anda akan menormalisasi semua dalam satu file JAR.
sumber
The executable packer maven plugin yang dapat digunakan untuk persis tujuan itu: membuat aplikasi mandiri java yang berisi semua dependensi sebagai file JAR di folder tertentu.
Cukup tambahkan yang berikut ini ke
pom.xml
dalam<build><plugins>
bagian Anda (pastikan untuk mengganti nilai yangmainClass
sesuai):File JAR yang dibangun terletak di
target/<YourProjectAndVersion>-pkg.jar
setelah Anda menjalankanmvn package
. Semua dependensi waktu kompilasi dan runtime akan dimasukkan ke dalamlib/
folder di dalam file JAR.Penafian: Saya adalah pembuat plugin.
sumber
mengikuti tautan ini:
Cara: Eclipse Maven menginstal build jar dengan dependensi
saya menemukan bahwa ini bukan solusi yang bisa diterapkan karena loader kelas tidak memuat stoples dari dalam toples, jadi saya pikir saya akan membongkar dependensi di dalam toples.
sumber
Begini cara saya melakukannya:
Dan kemudian saya lari saja:
sumber
assembly
hanya akan meletakkan apa pun yang ada di "target / kelas" di JAR. Ini akan memastikan bahwa JAR menyertakan semua perubahan yang baru-baru ini Anda lakukan pada kode sumber. Jadi, Anda harus melakukan sesuatu seperti:mvn clean compile assembly:assembly
.Saya menemukan jawaban ini untuk pertanyaan:
http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html
Anda tidak hanya mendapatkan file lib dependen dalam folder lib, Anda juga mendapatkan direktur bin dengan unix dan dos yang dapat dieksekusi.
Eksekusi akhirnya memanggil java dengan argumen -cp yang mencantumkan semua lib dependen Anda juga.
Seluruh lot berada di folder appasembly di dalam folder target. Epik.
============= Ya, saya tahu ini adalah utas lama, tetapi masih mendapatkan hasil penelusuran yang tinggi, jadi saya pikir ini mungkin membantu orang seperti saya.
sumber
Ini jelas merupakan masalah classpath. Pertimbangkan bahwa classpath harus sedikit berubah saat Anda menjalankan program di luar IDE. Ini karena IDE memuat JAR lain yang terkait dengan folder akar proyek Anda, sedangkan dalam kasus JAR terakhir biasanya tidak benar.
Apa yang ingin saya lakukan dalam situasi ini adalah membuat JAR secara manual. Ini membutuhkan waktu paling lama 5 menit dan selalu menyelesaikan masalah. Saya tidak menyarankan Anda melakukan ini. Temukan cara untuk menggunakan Maven, itulah tujuannya.
sumber