Jawaban:
Secara umum, Anda tidak harus memasukkan apa pun ke dalam META-INF sendiri. Sebagai gantinya, Anda harus mengandalkan apa pun yang Anda gunakan untuk mengemas JAR Anda. Ini adalah salah satu area di mana saya pikir Ant benar-benar unggul: menentukan atribut manifes file JAR. Sangat mudah untuk mengatakan sesuatu seperti:
<jar ...>
<manifest>
<attribute name="Main-Class" value="MyApplication"/>
</manifest>
</jar>
Setidaknya, saya pikir itu mudah ... :-)
Intinya adalah bahwa META-INF harus dianggap sebagai direktori meta Java internal . Jangan macam-macam dengan itu! File apa pun yang ingin Anda sertakan dengan JAR Anda harus ditempatkan di beberapa sub-direktori lain atau di root JAR itu sendiri.
Dari Spesifikasi File JAR resmi (tautan menuju ke versi Java 7, tetapi teksnya belum berubah sejak setidaknya v1.3):
Direktori META-INF
File / direktori berikut dalam direktori META-INF dikenali dan ditafsirkan oleh Java 2 Platform untuk mengonfigurasi aplikasi, ekstensi, pemuat kelas, dan layanan:
MANIFEST.MF
File manifes yang digunakan untuk menentukan ekstensi dan paket data terkait.
INDEX.LIST
File ini dihasilkan oleh
-i
opsi " " baru dari alat jar, yang berisi informasi lokasi untuk paket yang ditentukan dalam aplikasi atau ekstensi. Ini adalah bagian dari implementasi JarIndex dan digunakan oleh pemuat kelas untuk mempercepat proses pemuatan kelas mereka.
x.SF
File tanda tangan untuk file JAR. 'x' adalah nama file dasar.
x.DSA
File blok tanda tangan yang dikaitkan dengan file tanda tangan dengan nama file basis yang sama. File ini menyimpan tanda tangan digital dari file tanda tangan yang sesuai.
services/
Direktori ini menyimpan semua file konfigurasi penyedia layanan.
Saya perhatikan bahwa beberapa perpustakaan Java sudah mulai menggunakan META-INF sebagai direktori untuk memasukkan file konfigurasi yang harus dikemas dan dimasukkan ke dalam CLASSPATH bersama dengan JARs. Misalnya, Spring memungkinkan Anda untuk mengimpor File XML yang ada di classpath menggunakan:
<import resource="classpath:/META-INF/cxf/cxf.xml" />
<import resource="classpath:/META-INF/cxf/cxf-extensions-*.xml" />
Dalam contoh ini, saya mengutip langsung dari Panduan Pengguna Apache CXF . Pada proyek yang saya kerjakan di mana kami harus mengizinkan beberapa tingkat konfigurasi melalui Spring, kami mengikuti konvensi ini dan meletakkan file konfigurasi kami di META-INF.
Ketika saya merenungkan keputusan ini, saya tidak tahu apa yang sebenarnya salah dengan hanya memasukkan file konfigurasi dalam paket Java tertentu, daripada di META-INF. Tetapi tampaknya standar de facto yang muncul; baik itu, atau anti-pola yang muncul :-)
Folder META-INF adalah rumah untuk file MANIFEST.MF . File ini berisi meta data tentang konten JAR. Sebagai contoh, ada entri yang disebut Main-Class yang menentukan nama kelas Java dengan main statis () untuk file JAR yang dapat dieksekusi.
Anda juga dapat menempatkan sumber daya statis di sana.
Sebagai contoh:
META-INF/resources/button.jpg
dan mendapatkannya di web3.0-container via
http://localhost/myapp/button.jpg
/META-INF/MANIFEST.MF memiliki arti khusus:
java -jar myjar.jar org.myserver.MyMainClass
Anda dapat memindahkan definisi kelas utama ke toples sehingga Anda dapat menyusutkan panggilan ke dalam java -jar myjar.jar
.java.lang.Package.getPackage("org.myserver").getImplementationTitle()
.Di Maven folder META-INF dipahami karena Layout Direktori Standar , yang dengan paket konvensi nama sumber daya proyek Anda dalam JAR: setiap direktori atau file yang ditempatkan dalam direktori $ {basedir} / src / main / resources dikemas ke dalam JAR Anda dengan struktur yang sama persis mulai dari dasar JAR. Folder $ {basedir} / src / main / resources / META-INF biasanya berisi file .properties sementara di jar berisi MANIFEST.MF , pom.properties , pom.xml yang dihasilkan , di antara file-file lainnya. Juga kerangka kerja seperti penggunaan Springclasspath:/META-INF/resources/
untuk melayani sumber daya web. Untuk informasi lebih lanjut, lihatBagaimana cara menambahkan sumber daya ke Proyek Maven saya .
Hanya untuk menambahkan informasi di sini, dalam kasus file PERANG, file META-INF / MANIFEST.MF menyediakan pengembang fasilitas untuk memulai pemeriksaan waktu penggunaan oleh wadah yang memastikan bahwa wadah dapat menemukan semua kelas aplikasi Anda tergantung pada. Ini memastikan bahwa jika Anda melewatkan JAR, Anda tidak perlu menunggu sampai aplikasi Anda meledak saat runtime untuk menyadari bahwa itu tidak ada.
Saya telah memikirkan masalah ini baru-baru ini. Tampaknya tidak ada batasan dalam penggunaan META-INF. Ada beberapa batasan, tentu saja, tentang perlunya meletakkan manifes di sana, tetapi tampaknya tidak ada larangan untuk meletakkan barang-barang lainnya di sana.
Mengapa demikian?
Kasus cxf mungkin sah. Berikut adalah tempat lain di mana non-standar ini direkomendasikan untuk mengatasi bug jahat di JBoss-ws yang mencegah validasi sisi server terhadap skema wsdl.
http://community.jboss.org/message/570377#570377
Tapi sepertinya tidak ada standar, kau tidak boleh. Biasanya hal-hal ini didefinisikan dengan sangat ketat, tetapi untuk beberapa alasan, sepertinya tidak ada standar di sini. Aneh. Sepertinya META-INF telah menjadi tempat menarik untuk setiap konfigurasi yang diperlukan yang tidak dapat dengan mudah ditangani dengan cara lain.
Menambahkan ke informasi di sini, META-INF adalah folder khusus yang ClassLoader
memperlakukan berbeda dari folder lain dalam toples. Elemen yang bersarang di dalam folder META-INF tidak dicampur dengan elemen di luarnya.
Anggap saja seperti root lain. Dari Enumerator<URL> ClassLoader#getSystemResources(String path)
perspektif metode et al:
Ketika lintasan yang diberikan dimulai dengan "META-INF", metode mencari sumber daya yang bersarang di dalam folder META-INF dari semua guci di jalur kelas.
Ketika lintasan yang diberikan tidak dimulai dengan "META-INF", metode mencari sumber daya di semua folder lain (di luar META-INF) dari semua stoples dan direktori di jalur kelas.
Jika Anda tahu tentang nama folder lain yang getSystemResources
diperlakukan khusus oleh metode ini, beri komentar tentangnya.
Jika Anda menggunakan JPA1, Anda mungkin harus meletakkan persistence.xml
file di sana yang menentukan nama unit kegigihan yang mungkin ingin Anda gunakan. Persistence-unit menyediakan cara yang mudah untuk menentukan satu set file metadata, dan kelas, dan guci yang berisi semua kelas untuk bertahan dalam pengelompokan.
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
// ...
EntityManagerFactory emf =
Persistence.createEntityManagerFactory(persistenceUnitName);
Lihat lebih lanjut di sini: http://www.datanucleus.org/products/datanucleus/jpa/emf.html
Semua jawaban benar. Meta-inf memiliki banyak tujuan. Selain itu, berikut adalah contoh tentang menggunakan wadah kucing jantan.
Pergi ke Tomcat Doc dan periksa atribut " Implementasi Standar> copyXML ".
Deskripsi di bawah.
Setel ke true jika Anda ingin deskriptor XML konteks yang disematkan di dalam aplikasi (terletak di /META-INF/context.xml) untuk disalin ke xmlBase Host pemilik saat aplikasi dikerahkan. Pada awal berikutnya, deskriptor XML konteks yang disalin akan digunakan dalam preferensi untuk konteks apa pun XML descriptor yang tertanam di dalam aplikasi bahkan jika deskriptor yang tertanam di dalam aplikasi lebih baru. Nilai bendera secara default menjadi false. Catatan jika atribut deployXML dari Host yang dimiliki adalah false atau jika atribut copyXML dari Host yang memiliki true, atribut ini tidak akan berpengaruh.
Anda memiliki file MANIFEST.MF di dalam folder META-INF Anda. Anda dapat menentukan dependensi opsional atau eksternal yang harus Anda akses.
Contoh:
Pertimbangkan Anda telah menggunakan aplikasi Anda dan wadah Anda (pada saat run time) mengetahui bahwa aplikasi Anda memerlukan versi perpustakaan yang lebih baru yang tidak ada di dalam folder Lib, dalam hal ini jika Anda telah menentukan versi opsional yang lebih baru MANIFEST.MF
maka aplikasi Anda akan merujuk untuk ketergantungan dari sana (dan tidak akan macet).
Source:
Kepala Jsp & Servlet Pertama