Mục đích của META-INF là gì?


Câu trả lời:


65

Nói chung, bạn không nên tự mình đặt bất cứ thứ gì vào META-INF. Thay vào đó, bạn nên dựa vào bất cứ thứ gì bạn sử dụng để đóng gói JAR của bạn. Đây là một trong những lĩnh vực mà tôi nghĩ Ant thực sự vượt trội: chỉ định các thuộc tính tệp kê khai tệp JAR. Rất dễ để nói điều gì đó như:

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

Ít nhất, tôi nghĩ điều đó thật dễ dàng ... :-)

Vấn đề là META-INF nên được coi là một thư mục meta Java nội bộ . Đừng lộn xộn với nó! Bất kỳ tệp nào bạn muốn đưa vào JAR của bạn nên được đặt trong một số thư mục con khác hoặc tại thư mục gốc của chính JAR.


17
Còn dịch vụ thì sao? Tag mô tả thư viện? Đặt một cái gì đó vào gốc của JAR là một ý tưởng tồi. Trong trường hợp không có một quy ước rõ ràng, các tài nguyên trong thư mục gốc rất có khả năng va chạm.
erickson

13
Nếu bạn đang sử dụng JPA thì bạn phải đặt tệp Persence.xml vào thư mục đó, đó là điều không tự động xảy ra.
JRSofty

4
Đây sẽ là một câu trả lời tốt, ngoại trừ trong một ứng dụng Spring MVC đơn giản, META-INF là thư mục duy nhất mà các tệp cấu hình có thể được tham chiếu cả bằng các bài kiểm tra đơn vị và bộ điều khiển. Nếu một thư mục khác hoạt động sẽ rất tuyệt - thì không (ít nhất là không đơn giản). Đối với tôi, xây dựng một tập tin Jar chỉ để kiểm tra một tập tin chiến tranh cũng giống như xây dựng một chiếc xe hơi để bạn có thể đi bộ đến nhà bếp. Ít nhất cho tôi. Nhưng tôi đã dành một chút thời gian để làm Ruby và chúng có thể đã hủy hoại tôi khi có các tệp cấu hình (mặc dù tôi sẽ giao dịch một chút địa ngục XML để biết các loại tham số của tôi là gì). :)
John Lockwood

Bạn có thể cho chúng tôi một số ví dụ về các loại tệp nên chứa thư mục này?
Menai Ala Eddine - Aladdin

3
Điều này không trả lời META-INF là gì. Nếu tôi có câu trả lời cho điều đó, thì có lẽ tôi có thể đánh giá liệu việc đưa thứ gì đó vào thư mục đó có nên "không bao giờ" được không, chính tôi.
Kröw

164

Từ Đặc tả tệp JAR chính thức (liên kết đến phiên bản Java 7, nhưng văn bản đã không thay đổi kể từ ít nhất v1.3):

Thư mục META-INF

Các tệp / thư mục sau trong thư mục META-INF được Nền tảng Java 2 nhận ra và diễn giải để định cấu hình các ứng dụng, tiện ích mở rộng, trình tải lớp và dịch vụ:

  • MANIFEST.MF

Tệp kê khai được sử dụng để xác định dữ liệu liên quan đến phần mở rộng và gói.

  • INDEX.LIST

Tệp này được tạo bởi -itùy chọn " " mới của công cụ jar, chứa thông tin vị trí cho các gói được xác định trong ứng dụng hoặc tiện ích mở rộng. Nó là một phần của việc triển khai Jar Index và được các trình tải lớp sử dụng để tăng tốc quá trình tải lớp của họ.

  • x.SF

Tệp chữ ký cho tệp JAR. 'x' là viết tắt của tên tệp cơ sở.

  • x.DSA

Tệp khối chữ ký được liên kết với tệp chữ ký có cùng tên tệp cơ sở. Tập tin này lưu trữ chữ ký số của tập tin chữ ký tương ứng.

  • services/

Thư mục này lưu trữ tất cả các tập tin cấu hình nhà cung cấp dịch vụ.


3
TLD cũng phải tuân theo META-INF.
erickson

@erickson, Xây dựng?
Pacerier

Các bộ mô tả thư viện thẻ @Pacerier cho các thư viện thẻ JSP phải được đặt trong thư mục META-INF. Tôi đã quên những gì TLD đã ủng hộ trong năm 2008
erickson

27

Tôi đã nhận thấy rằng một số thư viện Java đã bắt đầu sử dụng META-INF như một thư mục để bao gồm các tệp cấu hình nên được đóng gói và đưa vào CLASSPATH cùng với JAR. Ví dụ: Spring cho phép bạn nhập các tệp XML trên đường dẫn lớp bằng cách sử dụng:

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

Trong ví dụ này, tôi trích dẫn thẳng ra Hướng dẫn sử dụng Apache CXF . Trong một dự án mà tôi đã làm việc trong đó chúng tôi phải cho phép nhiều cấp cấu hình thông qua Spring, chúng tôi đã tuân theo quy ước này và đưa các tệp cấu hình của chúng tôi vào META-INF.

Khi tôi suy nghĩ về quyết định này, tôi không biết chính xác điều gì sẽ sai khi chỉ bao gồm các tệp cấu hình trong một gói Java cụ thể, thay vì trong META-INF. Nhưng nó dường như là một tiêu chuẩn thực tế mới nổi; hoặc đó, hoặc một mô hình chống mới nổi :-)


4
Cấu hình không thuộc về một thư viện. Tôi nghĩ rằng bạn đóng đinh nó với "mô hình chống mới nổi". Thật dễ dàng để xác định vị trí các tệp cấu hình liên quan đến thư viện; họ không cần phải đi trong cùng một JAR.
erickson

24
Tôi không đồng ý với tuyên bố rằng cấu hình không thuộc về thư viện. Tôi nghĩ rằng cấu hình, đặc biệt là khi mặc định, được đóng gói tốt trong thư viện. Tôi thực sự vui mừng khi nhiều khung công tác đã chọn làm việc như thế này thay vì buộc bạn phải bao gồm tất cả các loại tệp cấu hình bên ngoài như phổ biến cách đây không lâu.
Eelco

1
Tôi cũng đã thấy rất nhiều tệp loại LICENSE.TXT hiển thị trong META_INF, điều mà tôi thấy khó chịu.
Ti Strga

@Eelco, Mã và dữ liệu không nên trộn lẫn. Bao gồm các tệp cấu hình bên ngoài không cần thiết có nghĩa là một mớ hỗn độn về khả năng sử dụng. Nó phụ thuộc vào cách nó được cấu trúc.
Pacerier

1
Đó là một điều khá độc đoán đối với @Pacerier. Như một tuyên bố chung, nó chủ yếu là ưu tiên.
Eelco

13

Thư mục META-INF là ngôi nhà cho tệp MANIFEST.MF . Tệp này chứa dữ liệu meta về nội dung của JAR. Ví dụ, có một mục được gọi là Main-Class chỉ định tên của lớp Java với hàm main () cho các tệp JAR thực thi.


10

Bạn cũng có thể đặt tài nguyên tĩnh trong đó.

Trong ví dụ:

META-INF/resources/button.jpg 

và lấy chúng trong web3.0-container thông qua

http://localhost/myapp/button.jpg

> Đọc thêm

/META-INF/MANIFEST.MF có một ý nghĩa đặc biệt:

  1. Nếu bạn chạy một jar bằng cách sử dụng, java -jar myjar.jar org.myserver.MyMainClassbạn có thể di chuyển định nghĩa lớp chính vào jar để bạn có thể thu nhỏ cuộc gọi vào java -jar myjar.jar.
  2. Bạn có thể xác định Metainformations cho các gói nếu bạn sử dụng java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Bạn có thể tham khảo các chứng chỉ kỹ thuật số bạn muốn sử dụng trong chế độ Applet / Webstart.

Vì vậy, bất kỳ nội dung tĩnh trong ứng dụng nên được đặt trong thư mục này như hình ảnh hoặc những thứ khác.
Menai Ala Eddine - Aladdin

6

META-INF trong Maven

Trong Maven, thư mục META-INF được hiểu là do Bố cục thư mục tiêu chuẩn , theo quy ước tên gói tài nguyên dự án của bạn trong JAR: mọi thư mục hoặc tệp được đặt trong thư mục $ {Dựair} / src / main / resource được đóng gói vào JAR của bạn với cấu trúc chính xác tương tự bắt đầu từ cơ sở của JAR. Thư mục $ {Dựair} / src / main / resource / META-INF thường chứa các tệp .properations trong khi trong tệp chứa MANIFEST.MF , pom.propericat , pom.xml , trong số các tệp khác. Ngoài ra các khung như Spring sử dụng classpath:/META-INF/resources/để phục vụ tài nguyên web. Để biết thêm thông tin xem Làm cách nào để thêm tài nguyên vào Dự án Maven của tôi .


5

Chỉ cần thêm vào thông tin ở đây, trong trường hợp tệp WAR, tệp META-INF / MANIFEST.MF cung cấp cho nhà phát triển một cơ sở để bắt đầu kiểm tra thời gian triển khai bởi container để đảm bảo rằng container có thể tìm thấy tất cả các lớp ứng dụng của bạn phụ thuộc. Điều này đảm bảo rằng trong trường hợp bạn bỏ lỡ một JAR, bạn không phải đợi cho đến khi ứng dụng của bạn hoạt động trong thời gian chạy để nhận ra rằng nó bị thiếu.


5

Tôi đã suy nghĩ về vấn đề này gần đây. Thực sự không có bất kỳ hạn chế nào đối với việc sử dụng META-INF. Tất nhiên, có một số hạn chế nhất định về sự cần thiết phải đặt bảng kê khai ở đó, nhưng dường như không có bất kỳ sự cấm đoán nào về việc đưa những thứ khác vào đó.

Tại sao điều này là trường hợp?

Trường hợp cxf có thể là hợp pháp. Đây là một nơi khác, nơi phi tiêu chuẩn này được khuyến nghị để khắc phục một lỗi khó chịu trong JBoss-ws ngăn chặn xác thực phía máy chủ đối với lược đồ của wsdl.

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

Nhưng thực sự không có bất kỳ tiêu chuẩn, bất kỳ tiêu chuẩn nào. Thông thường những điều này được xác định rất nghiêm ngặt, nhưng vì một số lý do, dường như không có tiêu chuẩn nào ở đây. Lạ Có vẻ như META-INF đã trở thành một nơi hấp dẫn cho bất kỳ cấu hình cần thiết nào mà không thể dễ dàng xử lý theo một cách khác.


5

Thêm vào thông tin ở đây, META-INF là một thư mục đặc biệt ClassLoaderxử lý khác với các thư mục khác trong bình. Các phần tử được lồng trong thư mục META-INF không được trộn lẫn với các phần tử bên ngoài nó.

Hãy nghĩ về nó như một gốc khác. Từ Enumerator<URL> ClassLoader#getSystemResources(String path)phương pháp et al phối cảnh:

Khi đường dẫn đã cho bắt đầu bằng "META-INF", phương thức sẽ tìm kiếm các tài nguyên được lồng trong các thư mục META-INF của tất cả các tệp trong đường dẫn lớp.

Khi đường dẫn đã cho không bắt đầu bằng "META-INF", phương thức sẽ tìm kiếm tài nguyên trong tất cả các thư mục khác (bên ngoài META-INF) của tất cả các tệp và thư mục trong đường dẫn lớp.

Nếu bạn biết về một tên thư mục khác mà getSystemResourcesphương thức xử lý đặc biệt, vui lòng nhận xét về nó.


3

Nếu bạn đang sử dụng JPA1, bạn có thể phải bỏ một persistence.xml tệp vào đó chỉ định tên của đơn vị lưu giữ lâu bền mà bạn có thể muốn sử dụng. Một đơn vị kiên trì cung cấp một cách thuận tiện để chỉ định một tập hợp các tệp siêu dữ liệu và các lớp và các tệp có chứa tất cả các lớp được duy trì trong một nhóm.

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

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

Xem thêm tại đây: http://www.datanucleus.org/products/datanucleus/jpa/emf.html


1

Tất cả các câu trả lời đều đúng. Meta-inf có nhiều mục đích. Ngoài ra, đây là một ví dụ về việc sử dụng container tomcat.

Truy cập Tomcat Doc và kiểm tra " Thực hiện tiêu chuẩn> copyXML thuộc tính " ".

Mô tả dưới đây.

Đặt thành true nếu bạn muốn một bộ mô tả XML ngữ cảnh được nhúng bên trong ứng dụng (có tại /META-INF/context.xml) để được sao chép sang xmlBase của chủ sở hữu khi ứng dụng được triển khai. Trong các lần khởi động tiếp theo, bộ mô tả XML bối cảnh được sao chép sẽ được sử dụng theo sở thích đối với bất kỳ bộ mô tả XML ngữ cảnh nào được nhúng bên trong ứng dụng ngay cả khi bộ mô tả được nhúng bên trong ứng dụng gần đây hơn. Giá trị của cờ mặc định là sai. Lưu ý nếu thuộc tính triển khai MLX của Máy chủ sở hữu là sai hoặc nếu thuộc tính copyXML của Máy chủ sở hữu là đúng, thuộc tính này sẽ không có hiệu lực.


0

Bạn có tệp MANIFEST.MF trong thư mục META-INF. Bạn có thể xác định các phụ thuộc tùy chọn hoặc bên ngoài mà bạn phải có quyền truy cập.

Thí dụ:

Hãy xem xét bạn đã triển khai ứng dụng và thùng chứa của bạn (trong thời gian chạy) phát hiện ra rằng ứng dụng của bạn yêu cầu phiên bản mới hơn của thư viện không nằm trong thư mục lib, trong trường hợp đó nếu bạn đã xác định phiên bản mới hơn tùy chọn MANIFEST.MFthì ứng dụng của bạn sẽ tham chiếu phụ thuộc từ đó (và sẽ không sụp đổ).

Source: Đầu Jsp & Servlet


1
Không rõ bao nhiêu trong số này được trích dẫn từ nguồn, và nó không có vẻ nguyên văn. Xóa định dạng kỳ quái. Không sử dụng định dạng mã cho văn bản không phải là mã. Sử dụng định dạng trích dẫn cho văn bản được trích dẫn.
Hầu tước Lorne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.