Di Jawa, Anda sering melihat folder META-INF yang berisi beberapa file meta. Apa tujuan folder ini dan apa yang bisa saya taruh di sana?
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 Semut 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 internal Java meta. 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 versi Java 7, tetapi teksnya belum berubah sejak setidaknya v1.3):
Direktori META-INF
File/direktori berikut dalam direktori META-INF diakui dan ditafsirkan oleh Platform Java 2 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 opsi "
-i
" 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 telah memperhatikan bahwa beberapa perpustakaan Java sudah mulai menggunakan META-INF sebagai direktori untuk menyertakan file konfigurasi yang harus dikemas dan dimasukkan dalam CLASSPATH bersama dengan JAR. Sebagai contoh, 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 merefleksikan keputusan ini, saya tidak tahu apa yang sebenarnya salah dengan hanya memasukkan file konfigurasi dalam paket Java tertentu, bukan dalam 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. Misalnya, 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 dalam toples sehingga Anda dapat mengecilkan panggilan menjadi Java -jar myjar.jar
.Java.lang.Package.getPackage("org.myserver").getImplementationTitle()
.Hanya untuk menambah 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 pada saat runtime untuk menyadari bahwa itu tidak ada.
Menambah informasi di sini, META-INF adalah folder khusus yang diperlakukan ClassLoader
secara 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 perspektif metode Enumerator<URL> ClassLoader#getSystemResources(String path)
dkk:
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 memperlakukan metode getSystemResources
khusus, silakan komentar tentang hal itu.
Saya telah memikirkan masalah ini baru-baru ini. Tampaknya tidak ada batasan dalam penggunaan META-INF. Ada beberapa batasan tertentu, 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, Anda 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.
Di Maven folder META-INF dipahami karena Layout Direktori Standar yang dengan nama paket konvensi sumber daya proyek Anda dalam JARs : setiap direktori atau file yang ditempatkan dalam direktori $ {basedir}/src/main/resources dikemas ke dalam JAR Anda dengan struktur yang sama persis dimulai dari dasar JAR. Folder $ {basedir}/src/main/resources/META-INF biasanya berisi file . Properties sementara di jar berisi a dihasilkan MANIFEST.MF , pom.properties , the pom.xml , di antara file-file lain. Juga kerangka kerja seperti Spring gunakan classpath:/META-INF/resources/
untuk melayani sumber daya web. Untuk informasi lebih lanjut, lihat Bagaimana saya menambahkan sumber daya ke Proyek Maven saya
Jika Anda menggunakan JPA1, Anda mungkin harus meletakkan file persistence.xml
di sana yang menentukan nama unit-kegigihan yang mungkin ingin Anda gunakan. Persistence-unit menyediakan cara yang mudah untuk menetapkan 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 Tomcat.
Pergi ke Tomcat Doc dan centang " Implementasi Standar> copyXML " atribut.
Deskripsi di bawah.
Setel ke true jika Anda ingin deskriptor XML konteks yang tertanam di dalam aplikasi (terletak di /META-INF/context.xml) untuk disalin ke xmlBase Host yang memiliki ketika 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 default ke false. Catatan jika atribut deployXML dari Host yang dimiliki adalah salah 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 mendefinisikan 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 di MANIFEST.MF
maka aplikasi Anda akan merujuk pada ketergantungan dari sana (dan tidak akan macet).
Source:
Head First Jsp & Servlet