META-INF'nin amacı nedir?


Yanıtlar:


65

Genel olarak konuşursak, META-INF'e hiçbir şey koymamalısınız. Bunun yerine, JAR'inizi paketlemek için kullandığınız her şeye güvenmelisiniz. Bu Ant gerçekten excels düşünüyorum alanlarından biridir: JAR dosyası manifest öznitelikleri belirtme. Şöyle bir şey söylemek çok kolay:

<jar ...>
    <manifest>
        <attribute name="Main-Class" value="MyApplication"/>
    </manifest>
</jar>

En azından bence bu kolay ... :-)

Mesele şu ki META-INF bir dahili Java meta dizini olarak düşünülmelidir . Onunla uğraşma! JAR'nıza dahil etmek istediğiniz dosyalar başka bir alt dizine veya JAR'ın kök dizinine yerleştirilmelidir.


17
Hizmetler ne olacak? Etiket kütüphanesi tanımlayıcıları? Bir JAR'ın köküne bir şey koymak kötü bir fikirdir. Açık bir sözleşmenin yokluğunda, kökteki kaynakların çarpışması çok olasıdır.
erickson

13
JPA kullanıyorsanız, bu klasöre bir persistence.xml koymalısınız, bu otomatik olarak gerçekleşmeyen bir şeydir.
JRSofty

4
Basit bir Spring MVC uygulamasında META-INF, konfigürasyon dosyalarına hem birim testleri hem de kontrolörler tarafından referans verilebilecek tek dizin olması dışında bu iyi bir cevap olacaktır. Başka bir dizin işe yaradıysa, bu harika olurdu - (en azından doğrudan değil). Bana göre, bir savaş dosyasını test etmek için bir Jar dosyası oluşturmak, bir araba inşa etmek gibidir, böylece mutfağa yürüyebilirsiniz. En azından benim için. Ama Ruby yapmak için biraz zaman harcadım ve yapılandırma dosyaları gittikçe beni mahvettiler (parametrelerimin türlerini bilmek için küçük bir XML cehennemi alıyorum). :)
John Lockwood

Bu klasörü içermesi gereken dosya türleri hakkında bize biraz örnek verebilir misiniz?
Menai Ala Eddine - Aladdin

3
Bu META-INF'in ne olduğunu cevaplamaz. Eğer bir cevabım olsaydı, o zaman bu klasöre bir şey koyup koymamayı kendim "asla" yapmamamız gerektiğine karar verebilirdim.
Kröw

164

Gönderen resmi JAR Dosya Şartname (link Java 7 sürümüne giden, ancak metin en az v1.3 az beri değişmemiş):

META-INF dizini

META-INF dizinindeki aşağıdaki dosyalar / dizinler, uygulamaları, uzantıları, sınıf yükleyicileri ve hizmetleri yapılandırmak için Java 2 Platformu tarafından tanınır ve yorumlanır:

  • MANIFEST.MF

Uzantı ve paketle ilgili verileri tanımlamak için kullanılan manifest dosyası.

  • INDEX.LIST

Bu dosya, -ibir uygulamada veya uzantıda tanımlanan paketler için konum bilgilerini içeren kavanoz aracının yeni " " seçeneği tarafından oluşturulur . JarIndex uygulamasının bir parçasıdır ve sınıf yükleyicileri tarafından sınıf yükleme işlemlerini hızlandırmak için kullanılır.

  • x.SF

JAR dosyasının imza dosyası. 'x' temel dosya adını gösterir.

  • x.DSA

Aynı temel dosya adına sahip imza dosyasıyla ilişkili imza bloğu dosyası. Bu dosya, karşılık gelen imza dosyasının dijital imzasını saklar.

  • services/

Bu dizin tüm servis sağlayıcı yapılandırma dosyalarını saklar.


3
TLD'ler de META-INF kapsamına girmelidir.
erickson

@erickson, Ayrıntılı mı?
Pacerier

JSP etiket kitaplıkları için @Pacerier etiket kitaplığı tanımlayıcıları META-INF dizininde bulunmalıdır. TLD'nin 2008'de ne için durduğunu unutmuştum.
erickson

27

Bazı Java kütüphanelerinin, JAR'larla birlikte paketlenip CLASSPATH'a dahil edilmesi gereken yapılandırma dosyalarını içerecek bir dizin olarak META-INF'yi kullanmaya başladığını fark ettim. Örneğin, Spring sınıf yolundaki XML Dosyalarını aşağıdakileri kullanarak içe aktarmanıza olanak tanır:

<import resource="classpath:/META-INF/cxf/cxf.xml" />
<import resource="classpath:/META-INF/cxf/cxf-extensions-*.xml" />

Bu örnekte, doğrudan Apache CXF Kullanıcı Kılavuzu'ndan alıntı yapıyorum . Spring üzerinden birden fazla konfigürasyona izin vermek zorunda kaldığımız bir projede, bu sözleşmeyi izledik ve konfigürasyon dosyalarımızı META-INF'e koyduk.

Bu kararı düşündüğümde, yapılandırma dosyalarını META-INF yerine belirli bir Java paketine dahil etmenin tam olarak neyin yanlış olacağını bilmiyorum. Fakat ortaya çıkan fiili bir standart gibi görünüyor; bu ya da ortaya çıkan bir anti-desen :-)


4
Konfigürasyon bir kütüphaneye ait değil. Sanırım bunu "ortaya çıkan anti-desen" ile çiviledin. Bir kütüphane ile ilgili yapılandırma dosyalarını bulmak gerçekten çok kolaydır; bulunabilmek için fiziksel olarak aynı JAR'a girmeleri gerekmez.
erickson

24
Yapılandırmanın bir kütüphaneye ait olmadığı ifadesine katılmıyorum. Bence yapılandırma, özellikle varsayılanlar söz konusu olduğunda, bir kütüphanede iyi paketlenmiştir. Aslında çok uzun zaman önce yaygın olmayan her türlü harici yapılandırma dosyasını dahil etmeye zorlamak yerine, daha fazla çerçevenin bu şekilde çalışmayı tercih ettiğine sevindim.
Eelco

1
Ben de can sıkıcı buldum META_INF de gösteren LICENSE.TXT tipi dosyaları bir sürü görüyorum.
Ti Strga

@Eelco, Kod ve veri gerektiğini değil karıştırın. Harici yapılandırma dosyalarını dahil etmek, kullanılabilirlik karmaşası anlamına gelmez. Nasıl yapılandırıldığına bağlıdır.
Pacerier

1
@Pacerier'i belirtmek oldukça keyfi bir şey. Genel bir açıklama olarak, büyük ölçüde tercih edilir.
Eelco

13

META-INF klasörü, MANIFEST.MF dosyasının ana sayfasıdır . Bu dosya JAR içeriği hakkında meta veriler içermektedir. Örneğin, yürütülebilir sınıf JAR dosyaları için statik main () ile Java sınıfının adını belirten Main-Class adlı bir girdi vardır.


10

Oraya statik kaynaklar da yerleştirebilirsiniz.

Örnek olarak:

META-INF/resources/button.jpg 

ve web3.0 kapsayıcısında

http://localhost/myapp/button.jpg

> Daha fazla bilgi

/META-INF/MANIFEST.MF'nin özel bir anlamı vardır:

  1. Kullanarak bir kavanoz çalıştırırsanız java -jar myjar.jar org.myserver.MyMainClass, ana sınıf tanımını kavanozun içine taşıyabilirsiniz, böylece aramayı daraltabilirsiniz java -jar myjar.jar.
  2. Kullandığınız takdirde paketlerde Metainformations tanımlayabilirsiniz java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Applet / Webstart modunda kullanmak istediğiniz dijital sertifikalara başvurabilirsiniz.

Bu yüzden uygulamadaki tüm statik şeyler, görüntüler veya diğer şeyler gibi bu dizine yerleştirilmelidir.
Menai Ala Eddine - Aladdin

6

Maven'de META-INF

Maven'de META-INF klasörü, standart kural düzeni nedeniyle anlaşılır ve ad kuralı proje kaynaklarınızı JAR'lar içinde paketler: $ {basedir} / src / main / resources dizinine yerleştirilmiş tüm dizinler veya dosyalar JAR'ınıza paketlenir tam olarak aynı yapı JAR tabanından başlayarak. Klasör $ {basedir} / src / main / resources / META-INF genellikle içerdiği .properties kavanoza bir oluşturulan içeriyor ise dosyaları MANIFEST.MF , pom.properties , pom.xml diğer dosyalar arasında. Ayrıca Bahar kullanımı gibi çerçevelerclasspath:/META-INF/resources/ web kaynakları hizmet etmek. Daha fazla bilgi için, bkzMaven Projeme nasıl kaynak eklerim .


5

Sadece buradaki bilgilere eklemek için, bir WAR dosyası durumunda, META-INF / MANIFEST.MF dosyası, geliştiriciye, kap tarafından uygulamanızın tüm sınıfları bulabilmesini sağlayan kapsayıcı tarafından bir dağıtım zamanı denetimi başlatma olanağı sağlar. bağlıdır. Bu, bir JAR'ı kaçırmanız durumunda, uygulamanızın eksik olduğunu fark etmek için çalışma zamanında patlamasını beklemek zorunda kalmamanızı sağlar.


5

Son zamanlarda bu konuyu düşünüyorum. META-INF kullanımında gerçekten herhangi bir kısıtlama yok gibi görünüyor. Tabii ki, tezahürü oraya koymanın gerekliliği ile ilgili bazı darlıklar var, ancak oraya başka şeyler koymakla ilgili herhangi bir yasak yok gibi görünüyor.

Neden böyle?

Cxf durumu yasal olabilir. Bu standart dışı JBoss-ws bir wsdl şemasına karşı sunucu tarafı doğrulamasını önleyen kötü bir hata almak için tavsiye başka bir yer.

http://community.jboss.org/message/570377#570377

Ama gerçekten herhangi bir standart var gibi görünmüyor. Genellikle bunlar çok titizlikle tanımlanır, ancak bir nedenden dolayı burada standart yok gibi görünüyor. Garip. Öyle görünüyor ki META-INF, başka herhangi bir şekilde kolayca ele alınamayan herhangi bir yapılandırma için bir yer haline gelmiştir.


5

Buradaki bilgilere ek olarak META-INF, ClassLoaderkavanozdaki diğer klasörlerden farklı davranan özel bir klasördür . META-INF klasörünün içine yerleştirilen öğeler, dışındaki öğelerle karıştırılmaz.

Başka bir kök gibi düşünün. Kaynaktan Enumerator<URL> ClassLoader#getSystemResources(String path)yöntem ve ark açısından:

Belirtilen yol "META-INF" ile başladığında, yöntem sınıf yolundaki tüm kavanozların META-INF klasörlerinin içine yerleştirilmiş kaynakları arar.

Belirtilen yol "META-INF" ile başlamazsa, yöntem sınıf yolundaki tüm kavanozların ve dizinlerin diğer tüm klasörlerindeki (META-INF dışında) kaynakları arar.

getSystemResourcesYöntemin özel olarak ele aldığı başka bir klasör adı biliyorsanız , lütfen bu konu hakkında yorum yapın.


3

JPA1 kullanıyorsanız, kullanmak isteyebileceğiniz persistence.xmlbir kalıcılık biriminin adını belirten bir dosya bırakmanız gerekebilir. Kalıcılık birimi, bir grup veri içinde kalıcı olacak tüm sınıfları içeren bir dizi meta veri dosyası, sınıf ve kavanoz belirtmek için uygun bir yol sağlar.

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

Buradan daha fazlasını görün: http://www.datanucleus.org/products/datanucleus/jpa/emf.html


1

Tüm cevaplar doğru. Meta-inf'nin birçok amacı vardır. Buna ek olarak, burada tomcat kabı kullanımına ilişkin bir örnek verilmiştir.

Tomcat Doc'a gidin ve " Standart Uygulama> copyXML'yi kontrol edin " özelliğini .

Açıklama aşağıdadır.

Uygulama içine gömülü bir bağlam XML tanımlayıcısının (/META-INF/context.xml dosyasında bulunur), uygulama dağıtıldığında sahip olan Ana Bilgisayarın xmlBase öğesine kopyalanmasını istiyorsanız true olarak ayarlayın. Sonraki başlangıçlarda, kopyalanan bağlam XML tanımlayıcısı, uygulamanın içine gömülü tanımlayıcı daha yeni olsa bile, uygulamanın içine yerleştirilmiş herhangi bir bağlam XML tanımlayıcısının yerine kullanılacaktır. Bayrağın değeri varsayılan olarak false olur. Sahip olan Ana Bilgisayarın deployXML özniteliği yanlışsa veya sahip Ana Bilgisayarın copyXML özniteliği doğru ise, bu özniteliğin bir etkisi olmayacağını unutmayın.


0

META-INF klasörünüzün içinde MANIFEST.MF dosyanız var. Şunları yapabilirsiniz isteğe bağlı veya dış bağımlılıkları tanımlamak size erişimi olmalıdır.

Misal:

Uygulamanızı dağıttığınızı ve kapsayıcınızın (çalışma zamanında) uygulamanızın lib klasörünün içinde olmayan yeni bir kitaplık sürümü gerektirdiğini, bu durumda isteğe bağlı yeni sürümü tanımladıysanız, MANIFEST.MFuygulamanızın oradan bağımlılığa (ve çökmeyecek).

Source: İlk Baş Jsp ve Servlet


1
Bunun ne kadarının kaynaktan alıntılandığı belli değil ve kelimesi kelimesine görünmüyor . Tuhaf biçimlendirme kaldırıldı. Kod olmayan metinler için kod biçimlendirmesi kullanmayın. Alıntılanan metin için alıntı biçimlendirmesi kullanın.
Lorne Marquis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.