2013-08-01 26 views
12

Tôi đang làm việc trên một dự án trong đó sử dụng JAAS và không may cho tôi Tomcat đòi hỏi một tập tin được đặt trong một thư mục META-INF trong thư mục gốc của cuộc chiếnMaven chiến tranh có thư mục META-INF ở hai nơi

app.war 
    |__META-INF 
    | |___context.xml 
... 

Tôi nghĩ rằng nó đã là lạ vì vị trí mặc định META-INF cho WAR's nằm trong thư mục lớp.

app.war 
    |__WEB-INF 
    | |__classes 
    |   |__META-INF 
... 

Vì vậy, tôi đang sử dụng Maven, trong đó nêu rằng bất cứ điều gì trong src/main/nguồn/META-INF sẽ được sao chép vào vị trí thích hợp, mà nó làm. Điều kỳ lạ là nó cũng tạo ra một thư mục META-INF trong thư mục gốc của cấu trúc tập tin để lại cho tôi với 2 thư mục META-INF.

Cấu trúc dự án

app 
    |__src/main/java 
    |__src/main/resources 
    |  |__META-INF 
    |    |__context.xml 
... 

Sau mvn gói

app 
    |__META-INF [1] 
    |__WEB-INF 
    |  |__classes 
    |   |__META-INF [2] 
    |     |__context.xml 
... 

Vì vậy, nếu tiêu chuẩn quốc gia chiến tranh mà META-INF nên dưới thư mục lớp học, như trong # 2, tại sao maven war tạo thư mụC# 1. Và có cách nào để sao chép tệp vào thư mục đó thay vì # 2 không?

Trân

Trả lời

11

Vì vậy, tôi thấy điều này:

Two Meta-Inf folders - normal structure?

trong đó nêu rằng có 2 thư mục META-INF không phải là một vấn đề. Đào một chút tôi thấy:

JAR File Specification

trong đó nêu về thư mục META-INF:

tập tin JAR Một bản chất là một file zip có chứa một thư mục META-INF tùy chọn. ... Thư mục META-INF, nếu nó tồn tại, được sử dụng để lưu trữ dữ liệu cấu hình gói và mở rộng, bao gồm bảo mật, phiên bản, mở rộng và dịch vụ.

và điều này:

JSR-000315 JavaTM Servlet 3.0

đó, trên phần 10,6, khẳng định về cấu trúc tập tin WAR:

Khi đóng gói thành một hình thức như vậy, một thư mục META-INF sẽ có mặt chứa thông tin hữu ích cho các công cụ lưu trữ Java. Thư mục này không được trực tiếp được cung cấp dưới dạng nội dung theo vùng chứa theo yêu cầu của khách hàng Web, mặc dù nội dung hiển thị với mã servlet thông qua lệnh gọi getResource và getResourceAsStream trên ServletContext. Ngoài ra, mọi yêu cầu truy cập tài nguyên trong thư mục META-INF phải được trả lại bằng phản hồi SC_NOT_FOUND (404).

Vì vậy, từ đặc tả WAR đúng nơi là WEB-INF/classes/META-INF.Tuy nhiên, kể từ khi chiến tranh là một tập tin jar đặc biệt, nó có ý nghĩa để có/META-INF là một điểm cho phần mở rộng. Người ta có thể thấy các cách sử dụng khác nhau như vậy trong tệp JPA persistence.xml so với tệp Tomcat context.xml: tệp trước nên được đặt trong WEB-INF/classes/META-INF trong khi tệp thứ hai trong/META-INF.

+0

Tệp .war là tệp .jar, vì vậy tệp có thể có thư mục META-INF giống như tệp .jar. – Hong

Các vấn đề liên quan