it-swarm-id.com

Apa tujuan META-INF?

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?

274
Kristian

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.

62
Daniel Spiewak

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.

159
aku

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

25
user38748

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.

10
Brian Matthews

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

> Baca lebih lanjut

/META-INF/MANIFEST.MF memiliki arti khusus:

  1. Jika Anda menjalankan toples menggunakan 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.
  2. Anda dapat mendefinisikan Metainformations ke paket jika Anda menggunakan Java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Anda dapat merujuk sertifikat digital yang ingin Anda gunakan dalam mode Applet/Webstart.
8
Peter Rader

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.

4
sasuke

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.

4
Readren

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.

4
Steve Cohen

META-INF dalam Maven

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

4
EliuX

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

3
f0ster

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.

1
Tugrul

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

0
Prateek Joshi