Apa tujuan META-INF?

298

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?

Kristian
sumber

Jawaban:

65

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.

Daniel Spiewak
sumber
17
Bagaimana dengan layanan? Tag deskriptor perpustakaan? Menempatkan sesuatu di root JAR adalah ide yang buruk. Dengan tidak adanya konvensi yang jelas, sumber daya di akar terlalu mungkin untuk bertabrakan.
erickson
13
Jika Anda menggunakan JPA maka Anda harus meletakkan persistence.xml ke folder itu, itu adalah sesuatu yang tidak terjadi secara otomatis.
JRSofty
4
Ini akan menjadi jawaban yang baik, kecuali bahwa dalam aplikasi Spring MVC yang sederhana, META-INF adalah satu-satunya direktori di mana file konfigurasi dapat dirujuk baik oleh unit test dan controller. Jika direktori lain berfungsi dengan baik - itu tidak (setidaknya tidak secara langsung). Bagi saya, membuat file Jar hanya untuk menguji file perang seperti membuat mobil sehingga Anda bisa berjalan ke dapur. Setidaknya bagi saya. Tapi saya menghabiskan beberapa waktu untuk melakukan Ruby, dan mereka mungkin telah menghancurkan saya sejauh file konfigurasi pergi (meskipun saya akan berdagang neraka XML kecil untuk mengetahui apa jenis parameter saya). :)
John Lockwood
Bisakah Anda memberi kami beberapa contoh tentang jenis file yang seharusnya berisi folder ini?
Menai Ala Eddine - Aladdin
3
Ini tidak menjawab apa itu META-INF. Jika saya punya jawaban untuk itu, maka mungkin saya bisa menilai apakah memasukkan sesuatu ke folder itu atau tidak "tidak pernah" dilakukan, sendiri.
Kröw
164

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 -iopsi " " 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.

aku
sumber
3
TLD juga harus menggunakan META-INF.
erickson
@erickson, Rumit?
Pacerier
@Pacerier deskriptor pustaka tag untuk pustaka tag JSP harus berada di direktori META-INF. Saya sudah lupa apa yang berdiri untuk TLD pada tahun 2008.
erickson
27

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

pengguna38748
sumber
4
Konfigurasi tidak termasuk dalam perpustakaan. Saya pikir Anda memakukannya dengan "muncul anti-pola". Sangat mudah menemukan file konfigurasi relatif ke perpustakaan; mereka tidak perlu secara fisik pergi dalam JAR yang sama untuk ditemukan.
erickson
24
Saya tidak setuju dengan pernyataan bahwa konfigurasi bukan milik perpustakaan. Saya pikir konfigurasi, terutama ketika datang ke default, dikemas dengan baik di perpustakaan. Saya sebenarnya senang lebih banyak kerangka kerja memilih untuk bekerja seperti ini daripada memaksa Anda untuk memasukkan semua jenis file konfigurasi eksternal seperti yang umum belum lama ini.
Eelco
1
Saya telah melihat banyak file tipe LICENSE.TXT yang muncul di META_INF juga, yang menurut saya mengganggu.
Ti Strga
@ Elco, Kode dan data tidak boleh dicampur. Termasuk file konfigurasi eksternal tidak perlu berarti kekacauan kegunaan. Itu tergantung pada bagaimana itu terstruktur.
Pacerier
1
Itu hal yang cukup arbitrer untuk menyatakan @Pacerier. Sebagai pernyataan umum, sebagian besar preferensi.
Eelco
13

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.

Brian Matthews
sumber
10

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.MyMainClassAnda dapat memindahkan definisi kelas utama ke toples sehingga Anda dapat menyusutkan panggilan ke dalam java -jar myjar.jar.
  2. Anda bisa 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.
Suram
sumber
Jadi segala hal statis dalam aplikasi harus ditempatkan di direktori ini seperti gambar atau barang lainnya.
Menai Ala Eddine - Aladdin
6

META-INF dalam Maven

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 .

EliuX
sumber
5

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.

sasuke
sumber
5

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.

Steve Cohen
sumber
5

Menambahkan ke informasi di sini, META-INF adalah folder khusus yang ClassLoadermemperlakukan 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 getSystemResourcesdiperlakukan khusus oleh metode ini, beri komentar tentangnya.

Readren
sumber
3

Jika Anda menggunakan JPA1, Anda mungkin harus meletakkan persistence.xmlfile 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

lebih baik
sumber
1

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.

Tugrul
sumber
0

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.MFmaka aplikasi Anda akan merujuk untuk ketergantungan dari sana (dan tidak akan macet).

Source: Kepala Jsp & Servlet Pertama

Prateek Joshi
sumber
1
Tidak jelas berapa banyak dari ini dikutip dari sumbernya, dan tidak terlihat kata demi kata. Pemformatan aneh yang dihapus. Jangan gunakan pemformatan kode untuk teks yang bukan kode. Gunakan format kutipan untuk teks yang dikutip.
Marquis of Lorne