2008-10-14 15 views
9

Có thể lưu trữ nội dung web (chẳng hạn như JSP, HTML, hình ảnh, CSS v.v.) trong tệp JAR không?Lưu trữ nội dung web trong một tệp JAR

Tôi đã xem xét các tùy chọn khác nhau để mô đun hóa ứng dụng web của chúng tôi và đây là một khả năng.

Chúng tôi hiện đang sử dụng JSF và Facelets cho công nghệ xem của chúng tôi - tôi nghĩ có thể viết một số dạng trình phân giải chế độ xem tùy chỉnh sẽ kiểm tra đường dẫn lớp chứ không phải thư mục hệ thống tệp. sẽ hoạt động.

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao! :)

Cập nhật: Tôi có thể nên làm rõ. Làm thế nào để bạn có được thùng chứa web (như Tomcat) để tải các tài nguyên từ một tệp JAR? Ví dụ, tôi triển khai một tệp .war với ứng dụng web của tôi. Nếu tôi truy cập /index.jsp, vùng chứa sẽ cố gắng tìm trong thư mục nội dung web cho một tệp có tên index.jsp.

Có cách nào dễ dàng để định cấu hình trình tải tài nguyên của riêng bạn bằng cách sử dụng Tomcat hoặc tương tự để nó tìm kiếm đường dẫn lớp cũng như hệ thống tệp không?

Trả lời

1

Tuyệt đối. Heck, bạn có thể lưu trữ nội dung trực tiếp trong tệp WAR, về cơ bản là tệp JAR với một vài bit phụ. Có, bạn có thể cần phải viết một trình phân giải tùy chỉnh để sử dụng ClassLoader.getResourceAsStream, nhưng về cơ bản vì bạn có khả năng tạo nội dung theo cách bạn muốn, tìm nạp nó từ tệp jar có vẻ hoàn toàn hợp lý. Có thể bạn sẽ muốn đảm bảo rằng nó chỉ tìm nạp một bộ tiện ích mở rộng rất cụ thể mặc dù :)

3

Có, bạn có thể lưu trữ tệp, ví dụ: các thuộc tính, xml, xslt, hình ảnh, vv; trong một tệp JAR (hoặc WAR) và kéo chúng vào thời gian chạy.

Để tải tài nguyên từ bình triển khai của bạn, hãy sử dụng mã sau.

this.getClass().getClassLoader().getResourceAsStream(filename) ; 

Trong dự án maven, thư mục được đặt trong tài nguyên được bao gồm trong bình. Tên tệp có liên quan đến thư mục gốc của tệp jar, vì vậy "./filename.xml" sẽ khớp với tệp filename.xml được đặt trong "/ src/java/resources".

1

Bạn cũng có thể sử dụng dự án weblets (xem https://weblets.dev.java.net/).

Bạn lưu trữ một số tài nguyên trong thư viện JAR (như hình ảnh, css, javascript ...) và bạn viết một tệp weblet-config.xml thực sự đơn giản. Sau đó, trong trang JSF, bạn có thể tham khảo trực tiếp với cú pháp này:

<h:graphicImage src="weblet://some-name/images/someimage.jpg" .../> 
+0

Cảm ơn, điều này thực sự hữu ích. Bây giờ, nếu chỉ có một cách để đưa JSF vào một tệp .jar ... –

1

Thẻ tập tin giống như một mảnh JSP có thể được đặt trong một cái lọ. Sử dụng các tập tin thẻ, có thể giúp bạn, nhưng tôi chưa bao giờ cố gắng sử dụng hình ảnh, CSS, vv trong một cái lọ.

3

Nếu bạn đang sử dụng Maven để xây dựng ứng dụng web của mình, bạn có thể xây dựng một WAR về tài nguyên và lớp phủ của bạn mà WAR lên webapp WAR của bạn tại thời gian xây dựng.

Tài nguyên WAR chứa tất cả các tệp JSP, hình ảnh, CSS, v.v. của bạn được gọi là "lớp phủ" và chỉ đơn giản là phụ thuộc trong ứng dụng web mục tiêu của bạn với loại được đặt thành "chiến tranh".

Khi bạn đóng gói ứng dụng web của mình, tài nguyên WAR sẽ chỉ sao chép trên các tệp không xung đột. Vì vậy, nếu bạn có một tệp index.jsp duy nhất trong dự án của mình và muốn sử dụng tệp đó thay vì index.jsp trong lớp phủ, chỉ cần đưa nó vào ứng dụng web mục tiêu của bạn và Maven sẽ không sao chép tài nguyên đó.

Thông tin thêm về số Maven War plugin page about overlays.

0

Trong Mặt JavaServer lõi, ấn bản thứ 3, trong "Bao bì thành phần tổng hợp trong JAR" trên trang. 382, nó nói về việc đóng gói các thành phần tổng hợp trong các tệp JAR.

"Tất cả những gì bạn phải làm là đặt thành phần tổng hợp và các tạo phẩm của nó, chẳng hạn như JavaScript, bảng định kiểu hoặc tệp thuộc tính, trong thư mục META-INF trong JAR, như trong Hình 9-14."

components.jar 
+-- META-INF 
    +-- resources 
     +-- css 
     | +-- styles.css 
     +-- images 
     | +-- back.png 
     +-- util 
      +-- icon.xhtml 
      +-- login.js 
      +-- login.properties 

Tôi không chắc chắn cách dễ dàng các tài nguyên này có thể được truy cập trực tiếp từ các ứng dụng khác chứ không phải các thành phần hỗn hợp chứa.