วัตถุประสงค์ของ META-INF คืออะไร?


คำตอบ:


65

โดยทั่วไปคุณไม่ควรใส่อะไรลงใน META-INF ด้วยตัวเอง แต่คุณควรพึ่งพาสิ่งที่คุณใช้ในการบรรจุหีบห่อของคุณ นี่เป็นหนึ่งในพื้นที่ที่ฉันคิดว่า Ant ยอดเยี่ยมจริงๆ: การระบุแอตทริบิวต์รายการไฟล์ JAR มันง่ายมากที่จะพูดบางสิ่งเช่น:

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

อย่างน้อยฉันคิดว่ามันง่าย ... :-)

ประเด็นก็คือ META-INF ควรได้รับการพิจารณาเป็นไดเรกทอรีเมตาภายในของ Java อย่ายุ่งกับมัน! ไฟล์ใด ๆ ที่คุณต้องการรวมไว้ใน JAR ของคุณควรอยู่ในไดเร็กทอรีย่อยอื่น ๆ หรือที่รูทของ JAR เอง


17
บริการอะไรบ้าง แท็ก descriptors ไลบรารีหรือไม่ การวางบางสิ่งในรูทของ JAR เป็นความคิดที่ไม่ดี ในกรณีที่ไม่มีข้อตกลงที่ชัดเจนทรัพยากรในรูทมักจะชนกันมากเกินไป
erickson

13
หากคุณกำลังใช้ JPA คุณต้องใส่ persistence.xml ลงในโฟลเดอร์นั้นนั่นคือสิ่งที่จะไม่เกิดขึ้นโดยอัตโนมัติ
JRSofty

4
นี่จะเป็นคำตอบที่ดียกเว้นในแอพ Spring MVC แบบธรรมดา META-INF เป็นไดเรกทอรีเดียวที่สามารถอ้างอิงไฟล์การกำหนดค่าได้ทั้งจากการทดสอบหน่วยและตัวควบคุม หากไดเร็กตอรี่อื่นใช้งานได้ดี - มันจะไม่ (อย่างน้อยก็ตรงไปตรงมา) สำหรับฉันแล้วการสร้างไฟล์ Jar เพื่อทดสอบไฟล์สงครามนั้นเหมือนกับการสร้างรถคุณสามารถเดินไปที่ห้องครัวได้ อย่างน้อยสำหรับฉัน แต่ฉันใช้เวลาทำ Ruby และพวกเขาอาจทำให้ฉันเสียหายตราบใดที่ไฟล์การกำหนดค่าไป (แม้ว่าฉันจะแลกเปลี่ยน XML XML เล็กน้อยเพราะรู้ว่าพารามิเตอร์ของฉันคืออะไร) :)
John Lockwood

คุณช่วยยกตัวอย่างบางส่วนเกี่ยวกับประเภทของไฟล์ที่ควรมีในโฟลเดอร์นี้ได้หรือไม่?
Menai Ala Eddine - Aladdin

3
นี่ไม่ได้ตอบว่า META-INF คืออะไร ถ้าฉันได้รับคำตอบจากนั้นฉันก็อาจจะตัดสินได้ว่าจะใส่อะไรลงไปในโฟลเดอร์นั้นหรือไม่ "ไม่เคย" ทำเอง
Kröw

164

จากข้อกำหนดคุณสมบัติไฟล์ JAR อย่างเป็นทางการ (ลิงก์ไปยังเวอร์ชัน Java 7 แต่ข้อความไม่เปลี่ยนแปลงตั้งแต่อย่างน้อย v1.3):

ไดเรกทอรี META-INF

ไฟล์ / ไดเร็กทอรีต่อไปนี้ในไดเร็กทอรี META-INF ได้รับการยอมรับและตีความโดยแพลตฟอร์ม Java 2 เพื่อกำหนดค่าแอปพลิเคชันส่วนขยายตัวโหลดคลาสและบริการ:

  • MANIFEST.MF

ไฟล์ Manifest ที่ใช้เพื่อกำหนดข้อมูลส่วนขยายและแพคเกจที่เกี่ยวข้อง

  • INDEX.LIST

ไฟล์นี้สร้างขึ้นโดย-iตัวเลือกใหม่ " " ของเครื่องมือ jar ซึ่งมีข้อมูลตำแหน่งสำหรับแพ็คเกจที่กำหนดในแอปพลิเคชันหรือส่วนขยาย มันเป็นส่วนหนึ่งของการติดตั้ง JarIndex และใช้โดยตัวโหลดคลาสเพื่อเพิ่มความเร็วในกระบวนการโหลดคลาส

  • x.SF

ไฟล์ลายเซ็นต์สำหรับไฟล์ JAR 'x' หมายถึงชื่อไฟล์ฐาน

  • x.DSA

ไฟล์บล็อกลายเซ็นที่เกี่ยวข้องกับไฟล์ลายเซ็นที่มีชื่อไฟล์ฐานเดียวกัน ไฟล์นี้เก็บลายเซ็นดิจิทัลของไฟล์ลายเซ็นที่เกี่ยวข้อง

  • services/

ไดเรกทอรีนี้เก็บไฟล์การกำหนดค่าของผู้ให้บริการทั้งหมด


3
TLD ต้องอยู่ภายใต้ META-INF ด้วย
erickson

@erickson บรรจง?
Pacerier

ตัวอธิบายไลบรารีแท็ก @Pacerier สำหรับไลบรารีแท็ก JSP ต้องอยู่ในไดเร็กทอรี META-INF ฉันลืมสิ่งที่ TLD ยืนสำหรับปี 2551
erickson

27

ฉันสังเกตว่าห้องสมุด Java บางแห่งเริ่มใช้ META-INF เป็นไดเรกทอรีที่จะรวมไฟล์การกำหนดค่าที่ควรทำแพ็กเกจและรวมอยู่ใน CLASSPATH พร้อมกับ JARs ตัวอย่างเช่น Spring อนุญาตให้คุณอิมพอร์ตไฟล์ XML ที่อยู่บน classpath โดยใช้:

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

ในตัวอย่างนี้ผม quoting ออกตรงของApache CXF คู่มือการใช้งาน ในโครงการที่ฉันทำงานซึ่งเราต้องอนุญาตการกำหนดค่าหลายระดับผ่านทาง Spring เราปฏิบัติตามอนุสัญญานี้และวางไฟล์การกำหนดค่าของเราใน META-INF

เมื่อฉันไตร่ตรองเกี่ยวกับการตัดสินใจครั้งนี้ฉันไม่รู้ว่าจะเกิดอะไรขึ้นกับการรวมไฟล์การกำหนดค่าในแพ็คเกจ Java เฉพาะแทนที่จะเป็น META-INF แต่ดูเหมือนว่าจะเป็นมาตรฐานใหม่ที่เกิดขึ้นจริง; ไม่ว่าจะเป็นหรือรูปแบบการต่อต้านที่เกิดขึ้นใหม่ :-)


4
การกำหนดค่าไม่ได้อยู่ในห้องสมุด ฉันคิดว่าคุณจับมันด้วย "รูปแบบการต่อต้านแบบใหม่" มันค่อนข้างง่ายในการค้นหาไฟล์กำหนดค่าที่เกี่ยวข้องกับไลบรารี พวกเขาไม่จำเป็นต้องไปพบ JAR เดียวกันด้วยตัวเอง
erickson

24
ฉันไม่เห็นด้วยกับข้อความที่ว่าการกำหนดค่าไม่ได้อยู่ในห้องสมุด ฉันคิดว่าการกำหนดค่าโดยเฉพาะอย่างยิ่งเมื่อมันมาถึงค่าเริ่มต้นจะถูกบรรจุในห้องสมุด ฉันดีใจมากที่เฟรมเวิร์กเลือกที่จะทำงานแบบนี้มากกว่าที่จะบังคับให้คุณรวมไฟล์การกำหนดค่าภายนอกทุกประเภทอย่างที่เคยเป็นมาเมื่อไม่นานมานี้
Eelco

1
ฉันเห็นไฟล์ประเภท LICENSE.TXT จำนวนมากปรากฏขึ้นใน META_INF ด้วยซึ่งฉันพบว่าน่ารำคาญ
Ti Strga

@Elco รหัสและข้อมูลไม่ควรผสมกัน การรวมไฟล์การกำหนดค่าภายนอกไม่จำเป็นต้องหมายถึงความวุ่นวายในการใช้งาน มันขึ้นอยู่กับว่ามันมีโครงสร้างอย่างไร
Pacerier

1
นั่นเป็นสิ่งที่ไม่มีกฎเกณฑ์ที่จะกล่าวถึง @Pacerier โดยทั่วไปแล้วมันเป็นเรื่องที่ชอบมาก
Eelco

13

โฟลเดอร์ META-INF เป็นที่ตั้งของไฟล์MANIFEST.MF ไฟล์นี้มีข้อมูลเมตาเกี่ยวกับเนื้อหาของ JAR ตัวอย่างเช่นมีรายการชื่อ Main-Class ที่ระบุชื่อของคลาส Java ด้วยสแตติก main () สำหรับไฟล์ JAR ที่รันได้


10

คุณยังสามารถวางทรัพยากรแบบคงที่ในนั้น

ในตัวอย่าง:

META-INF/resources/button.jpg 

และรับพวกเขาใน web3.0- คอนเทนเนอร์ผ่าน

http://localhost/myapp/button.jpg

> อ่านเพิ่มเติม

/META-INF/MANIFEST.MF มีความหมายพิเศษ:

  1. ถ้าคุณเรียกใช้ขวดใช้คุณสามารถย้ายการกำหนดระดับหลักลงในขวดเพื่อให้คุณสามารถโทรหดตัวลงในjava -jar myjar.jar org.myserver.MyMainClassjava -jar myjar.jar
  2. คุณสามารถกำหนด Metainformations java.lang.Package.getPackage("org.myserver").getImplementationTitle()แพคเกจถ้าคุณใช้
  3. คุณสามารถอ้างอิงใบรับรองดิจิทัลที่คุณต้องการใช้ในโหมด Applet / Webstart

ดังนั้นสิ่งคงที่ในแอปพลิเคชันควรอยู่ในไดเรกทอรีนี้เช่นรูปภาพหรือสิ่งอื่น ๆ
Menai Ala Eddine - Aladdin

6

META-INF ใน Maven

ใน Maven META-INFโฟลเดอร์เป็นที่เข้าใจเพราะมาตรฐานไดเรกทอรีเค้าโครงซึ่งโดยใช้ชื่อการประชุมจัดแพคเกจทรัพยากรในโครงการของคุณภายในไห: ไดเรกทอรีหรือไฟล์ใด ๆ ที่วางอยู่ภายใน$ {basedir} / src / main ทรัพยากร /ไดเรกทอรีจะบรรจุลงในขวดของคุณ ด้วยโครงสร้างเดียวกันที่แน่นอนเริ่มต้นที่ฐานของ JAR โฟลเดอร์$ {basedir} / src / main / resources / META-INFมักจะมีไฟล์. propertiesในขณะที่ jar ประกอบด้วยMANIFEST.MF ที่สร้างขึ้น, pom.properties , pom.xmlท่ามกลางไฟล์อื่น ๆ อีกทั้งเฟรมเวิร์กเช่นSpringใช้classpath:/META-INF/resources/เพื่อให้บริการเว็บ สำหรับข้อมูลเพิ่มเติมดูฉันจะเพิ่มทรัพยากรให้กับโครงการ Maven ของฉันได้อย่างไร


5

เพียงเพิ่มข้อมูลที่นี่ในกรณีของไฟล์ WAR ไฟล์ META-INF / MANIFEST.MF จะให้สิ่งอำนวยความสะดวกแก่นักพัฒนาเพื่อเริ่มการตรวจสอบเวลาการปรับใช้โดยคอนเทนเนอร์ซึ่งทำให้มั่นใจได้ว่าคอนเทนเนอร์สามารถค้นหาคลาสทั้งหมดที่แอปพลิเคชันของคุณ ขึ้นอยู่กับ. สิ่งนี้ช่วยให้มั่นใจได้ว่าในกรณีที่คุณพลาด JAR คุณไม่ต้องรอจนกว่าแอปพลิเคชันของคุณจะระเบิดที่รันไทม์เพื่อรับรู้ว่ามันหายไป


5

ฉันคิดถึงเรื่องนี้เมื่อไม่นานมานี้ ดูเหมือนจะไม่มีข้อ จำกัด ใด ๆ ในการใช้ META-INF แน่นอนว่ามีข้อ จำกัด บางประการเกี่ยวกับความจำเป็นในการแสดงความเห็นที่นั่น แต่ดูเหมือนจะไม่มีข้อห้ามใด ๆ เกี่ยวกับการวางสิ่งอื่น ๆ ที่นั่น

ทำไมเป็นกรณีนี้

กรณี cxf อาจถูกต้อง ที่นี่เป็นอีกที่ที่แนะนำให้ใช้มาตรฐานที่ไม่ได้มาตรฐานเพื่อรับบั๊กที่น่ารังเกียจใน JBoss-ws ที่ป้องกันการตรวจสอบฝั่งเซิร์ฟเวอร์กับสคีมาของ wsdl

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

แต่ดูเหมือนจะไม่มีมาตรฐานใด ๆ เลย โดยปกติสิ่งเหล่านี้จะถูกกำหนดอย่างเข้มงวด แต่ด้วยเหตุผลบางอย่างดูเหมือนว่าไม่มีมาตรฐานที่นี่ แปลก ดูเหมือนว่า META-INF จะกลายเป็นสถานที่สำหรับการกำหนดค่าที่จำเป็นซึ่งไม่สามารถจัดการได้อย่างง่ายดาย


5

การเพิ่มข้อมูลที่นี่ META-INF เป็นโฟลเดอร์พิเศษที่ClassLoaderถือว่าแตกต่างจากโฟลเดอร์อื่น ๆ ในขวด องค์ประกอบที่ซ้อนกันภายในโฟลเดอร์ META-INF จะไม่ถูกรวมเข้ากับองค์ประกอบภายนอก

คิดว่ามันเหมือนรากอื่น จากEnumerator<URL> ClassLoader#getSystemResources(String path)วิธีการและมุมมอง:

เมื่อเส้นทางที่กำหนดเริ่มต้นด้วย "META-INF" วิธีการค้นหาทรัพยากรที่ซ้อนอยู่ภายในโฟลเดอร์ META-INF ของขวดทั้งหมดในเส้นทางคลาส

เมื่อเส้นทางที่กำหนดไม่ได้ขึ้นต้นด้วย "META-INF" วิธีการค้นหาทรัพยากรในโฟลเดอร์อื่น ๆ ทั้งหมด (นอก META-INF) ของขวดและไดเรกทอรีทั้งหมดในคลาสพา ธ

หากคุณรู้เกี่ยวกับชื่อโฟลเดอร์อื่นที่getSystemResourcesวิธีการปฏิบัติเป็นพิเศษโปรดแสดงความคิดเห็นเกี่ยวกับมัน


3

หากคุณกำลังใช้ JPA1 คุณอาจต้องวางpersistence.xmlไฟล์ลงในนั้นซึ่งระบุชื่อของหน่วยการคงอยู่ที่คุณอาจต้องการใช้ persistence-unit จัดเตรียมวิธีที่สะดวกในการระบุชุดของไฟล์ข้อมูลเมตาและคลาสและไหที่มีคลาสทั้งหมดที่จะคงอยู่ในการจัดกลุ่ม

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

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

ดูเพิ่มเติมได้ที่นี่: http://www.datanucleus.org/products/datanucleus/jpa/emf.html


1

คำตอบทั้งหมดถูกต้อง Meta-inf มีวัตถุประสงค์มากมาย นอกจากนี้นี่คือตัวอย่างเกี่ยวกับการใช้ภาชนะบรรจุ Tomcat

ไปที่ Tomcat Docและตรวจสอบคุณสมบัติ " การติดตั้งแบบมาตรฐาน> copyXML "

คำอธิบายอยู่ด้านล่าง

ตั้งค่าเป็นจริงหากคุณต้องการให้ XML descriptor บริบทฝังอยู่ภายในแอ็พพลิเคชัน (อยู่ที่ /META-INF/context.xml) เพื่อคัดลอกไปยังเจ้าของ xmlBase ของโฮสต์เมื่อมีการปรับใช้แอปพลิเคชัน ในการเริ่มต้นลำดับต่อมาตัวอธิบาย XML บริบทที่คัดลอกจะถูกใช้ในการกำหนดค่าตามความชอบของตัวอธิบาย XML บริบทใด ๆ ที่ฝังอยู่ภายในแอ็พพลิเคชันแม้ว่าตัวให้คำอธิบายที่ฝังอยู่ภายในแอ็พพลิเคชันจะล่าสุด ค่าเริ่มต้นของค่าสถานะเป็นเท็จ หมายเหตุหากแอ็ตทริบิวต์ deployXML ของโฮสต์ที่เป็นเจ้าของนั้นเป็นเท็จหรือหากแอตทริบิวต์ copyXML ของโฮสต์ที่เป็นเจ้าของนั้นเป็นจริงแอ็ตทริบิวต์นี้จะไม่มีผลใด ๆ


0

คุณมีไฟล์ MANIFEST.MF อยู่ในโฟลเดอร์ META-INF ของคุณ คุณสามารถกำหนดการพึ่งพาที่เป็นทางเลือกหรือภายนอกที่คุณต้องมีสิทธิ์เข้าถึง

ตัวอย่าง:

พิจารณาว่าคุณได้ปรับใช้แอปของคุณและที่เก็บ (ในขณะดำเนินการ) พบว่าแอปของคุณต้องการไลบรารี่รุ่นใหม่ที่ไม่ได้อยู่ในโฟลเดอร์ lib ในกรณีนี้หากคุณกำหนดเวอร์ชั่นใหม่ที่เป็นตัวเลือกในMANIFEST.MFแอปของคุณ เพื่อการอ้างอิงจากที่นั่น (และจะไม่ผิดพลาด)

Source: หัวหน้า First Jsp & Servlet


1
ไม่มีความชัดเจนว่าจะอ้างถึงสิ่งนี้จากแหล่งข้อมูลเท่าใดและไม่ได้ดูเป็นคำต่อคำ ลบการจัดรูปแบบที่แปลกประหลาด อย่าใช้การจัดรูปแบบรหัสสำหรับข้อความที่ไม่ใช่รหัส ใช้การจัดรูปแบบคำพูดสำหรับข้อความที่ยกมา
มาร์ควิสแห่ง Lorne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.