ใน Java คุณมักจะเห็นโฟลเดอร์ META-INF ที่มีไฟล์เมตาบางไฟล์ โฟลเดอร์นี้มีจุดประสงค์อะไรและฉันจะใส่อะไรลงไป
ใน Java คุณมักจะเห็นโฟลเดอร์ META-INF ที่มีไฟล์เมตาบางไฟล์ โฟลเดอร์นี้มีจุดประสงค์อะไรและฉันจะใส่อะไรลงไป
คำตอบ:
โดยทั่วไปคุณไม่ควรใส่อะไรลงใน META-INF ด้วยตัวเอง แต่คุณควรพึ่งพาสิ่งที่คุณใช้ในการบรรจุหีบห่อของคุณ นี่เป็นหนึ่งในพื้นที่ที่ฉันคิดว่า Ant ยอดเยี่ยมจริงๆ: การระบุแอตทริบิวต์รายการไฟล์ JAR มันง่ายมากที่จะพูดบางสิ่งเช่น:
<jar ...>
<manifest>
<attribute name="Main-Class" value="MyApplication"/>
</manifest>
</jar>
อย่างน้อยฉันคิดว่ามันง่าย ... :-)
ประเด็นก็คือ META-INF ควรได้รับการพิจารณาเป็นไดเรกทอรีเมตาภายในของ Java อย่ายุ่งกับมัน! ไฟล์ใด ๆ ที่คุณต้องการรวมไว้ใน JAR ของคุณควรอยู่ในไดเร็กทอรีย่อยอื่น ๆ หรือที่รูทของ JAR เอง
จากข้อกำหนดคุณสมบัติไฟล์ 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/
ไดเรกทอรีนี้เก็บไฟล์การกำหนดค่าของผู้ให้บริการทั้งหมด
ฉันสังเกตว่าห้องสมุด 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 แต่ดูเหมือนว่าจะเป็นมาตรฐานใหม่ที่เกิดขึ้นจริง; ไม่ว่าจะเป็นหรือรูปแบบการต่อต้านที่เกิดขึ้นใหม่ :-)
โฟลเดอร์ META-INF เป็นที่ตั้งของไฟล์MANIFEST.MF ไฟล์นี้มีข้อมูลเมตาเกี่ยวกับเนื้อหาของ JAR ตัวอย่างเช่นมีรายการชื่อ Main-Class ที่ระบุชื่อของคลาส Java ด้วยสแตติก main () สำหรับไฟล์ JAR ที่รันได้
คุณยังสามารถวางทรัพยากรแบบคงที่ในนั้น
ในตัวอย่าง:
META-INF/resources/button.jpg
และรับพวกเขาใน web3.0- คอนเทนเนอร์ผ่าน
http://localhost/myapp/button.jpg
/META-INF/MANIFEST.MF มีความหมายพิเศษ:
java -jar myjar.jar org.myserver.MyMainClass
java -jar myjar.jar
java.lang.Package.getPackage("org.myserver").getImplementationTitle()
แพคเกจถ้าคุณใช้ใน 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 ของฉันได้อย่างไร
เพียงเพิ่มข้อมูลที่นี่ในกรณีของไฟล์ WAR ไฟล์ META-INF / MANIFEST.MF จะให้สิ่งอำนวยความสะดวกแก่นักพัฒนาเพื่อเริ่มการตรวจสอบเวลาการปรับใช้โดยคอนเทนเนอร์ซึ่งทำให้มั่นใจได้ว่าคอนเทนเนอร์สามารถค้นหาคลาสทั้งหมดที่แอปพลิเคชันของคุณ ขึ้นอยู่กับ. สิ่งนี้ช่วยให้มั่นใจได้ว่าในกรณีที่คุณพลาด JAR คุณไม่ต้องรอจนกว่าแอปพลิเคชันของคุณจะระเบิดที่รันไทม์เพื่อรับรู้ว่ามันหายไป
ฉันคิดถึงเรื่องนี้เมื่อไม่นานมานี้ ดูเหมือนจะไม่มีข้อ จำกัด ใด ๆ ในการใช้ META-INF แน่นอนว่ามีข้อ จำกัด บางประการเกี่ยวกับความจำเป็นในการแสดงความเห็นที่นั่น แต่ดูเหมือนจะไม่มีข้อห้ามใด ๆ เกี่ยวกับการวางสิ่งอื่น ๆ ที่นั่น
ทำไมเป็นกรณีนี้
กรณี cxf อาจถูกต้อง ที่นี่เป็นอีกที่ที่แนะนำให้ใช้มาตรฐานที่ไม่ได้มาตรฐานเพื่อรับบั๊กที่น่ารังเกียจใน JBoss-ws ที่ป้องกันการตรวจสอบฝั่งเซิร์ฟเวอร์กับสคีมาของ wsdl
http://community.jboss.org/message/570377#570377
แต่ดูเหมือนจะไม่มีมาตรฐานใด ๆ เลย โดยปกติสิ่งเหล่านี้จะถูกกำหนดอย่างเข้มงวด แต่ด้วยเหตุผลบางอย่างดูเหมือนว่าไม่มีมาตรฐานที่นี่ แปลก ดูเหมือนว่า META-INF จะกลายเป็นสถานที่สำหรับการกำหนดค่าที่จำเป็นซึ่งไม่สามารถจัดการได้อย่างง่ายดาย
การเพิ่มข้อมูลที่นี่ META-INF เป็นโฟลเดอร์พิเศษที่ClassLoader
ถือว่าแตกต่างจากโฟลเดอร์อื่น ๆ ในขวด องค์ประกอบที่ซ้อนกันภายในโฟลเดอร์ META-INF จะไม่ถูกรวมเข้ากับองค์ประกอบภายนอก
คิดว่ามันเหมือนรากอื่น จากEnumerator<URL> ClassLoader#getSystemResources(String path)
วิธีการและมุมมอง:
เมื่อเส้นทางที่กำหนดเริ่มต้นด้วย "META-INF" วิธีการค้นหาทรัพยากรที่ซ้อนอยู่ภายในโฟลเดอร์ META-INF ของขวดทั้งหมดในเส้นทางคลาส
เมื่อเส้นทางที่กำหนดไม่ได้ขึ้นต้นด้วย "META-INF" วิธีการค้นหาทรัพยากรในโฟลเดอร์อื่น ๆ ทั้งหมด (นอก META-INF) ของขวดและไดเรกทอรีทั้งหมดในคลาสพา ธ
หากคุณรู้เกี่ยวกับชื่อโฟลเดอร์อื่นที่getSystemResources
วิธีการปฏิบัติเป็นพิเศษโปรดแสดงความคิดเห็นเกี่ยวกับมัน
หากคุณกำลังใช้ 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
คำตอบทั้งหมดถูกต้อง Meta-inf มีวัตถุประสงค์มากมาย นอกจากนี้นี่คือตัวอย่างเกี่ยวกับการใช้ภาชนะบรรจุ Tomcat
ไปที่ Tomcat Docและตรวจสอบคุณสมบัติ " การติดตั้งแบบมาตรฐาน> copyXML "
คำอธิบายอยู่ด้านล่าง
ตั้งค่าเป็นจริงหากคุณต้องการให้ XML descriptor บริบทฝังอยู่ภายในแอ็พพลิเคชัน (อยู่ที่ /META-INF/context.xml) เพื่อคัดลอกไปยังเจ้าของ xmlBase ของโฮสต์เมื่อมีการปรับใช้แอปพลิเคชัน ในการเริ่มต้นลำดับต่อมาตัวอธิบาย XML บริบทที่คัดลอกจะถูกใช้ในการกำหนดค่าตามความชอบของตัวอธิบาย XML บริบทใด ๆ ที่ฝังอยู่ภายในแอ็พพลิเคชันแม้ว่าตัวให้คำอธิบายที่ฝังอยู่ภายในแอ็พพลิเคชันจะล่าสุด ค่าเริ่มต้นของค่าสถานะเป็นเท็จ หมายเหตุหากแอ็ตทริบิวต์ deployXML ของโฮสต์ที่เป็นเจ้าของนั้นเป็นเท็จหรือหากแอตทริบิวต์ copyXML ของโฮสต์ที่เป็นเจ้าของนั้นเป็นจริงแอ็ตทริบิวต์นี้จะไม่มีผลใด ๆ
คุณมีไฟล์ MANIFEST.MF อยู่ในโฟลเดอร์ META-INF ของคุณ คุณสามารถกำหนดการพึ่งพาที่เป็นทางเลือกหรือภายนอกที่คุณต้องมีสิทธิ์เข้าถึง
ตัวอย่าง:
พิจารณาว่าคุณได้ปรับใช้แอปของคุณและที่เก็บ (ในขณะดำเนินการ) พบว่าแอปของคุณต้องการไลบรารี่รุ่นใหม่ที่ไม่ได้อยู่ในโฟลเดอร์ lib ในกรณีนี้หากคุณกำหนดเวอร์ชั่นใหม่ที่เป็นตัวเลือกในMANIFEST.MF
แอปของคุณ เพื่อการอ้างอิงจากที่นั่น (และจะไม่ผิดพลาด)
Source:
หัวหน้า First Jsp & Servlet