2010-03-31 29 views
8

Nếu tôi có một tập hợp các tệp tài nguyên trong một thư mục trên đường dẫn lớp của tôi, tôi có thể liệt kê chúng bằng cách sử dụng ClassLoader.getResources(location).Làm cách nào để tìm tài nguyên bằng .jar trên đường dẫn classpath?

Ví dụ: nếu tôi có /mydir/myresource.properties trên đường dẫn lớp, tôi có thể gọi cho trình nạp lớp getResources("mydir") và nhận một điều tra URL chứa myresource.properties.

Khi tôi đóng gói cùng một tài nguyên chính xác vào .jar, tôi không nhận được bất kỳ điều gì trong việc liệt kê các URL khi tôi thực hiện cuộc gọi. Tôi đã chỉ thay thế cấu trúc thư mục bằng một cái lọ chứa các thư mục đó (đó là một webapp, vì vậy cái bình sẽ đi vào /WEB-INF/lib). Tôi cũng đã nhận được một số cuộc gọi khác bằng cách sử dụng getResourceAsStream(location) để nhận các tài nguyên khác theo tên và tất cả đều hoạt động tốt.

Điều gì khác về liệt kê tài nguyên khi tài nguyên ở dạng .jar?


Cập nhật - Tôi đã sao chép (ish) hành vi bên ngoài vùng chứa. Đoạn mã sau dẫn đến đối tượng dirProperties có các khóa được đặt thành tên tài nguyên trong gói, nhưng nếu gói nằm trong .jar sẽ ném NullPointerException trong phương thức Properties.load (InputStream).

Properties dirProperties = new Properties(); 
dirProperties.load(this.getClass().getClassLoader().getResourceAsStream(location)); 

Mã tương tự trên thùng chứa (Tomcat 5.5) không ngoại lệ nhưng tạo đối tượng Thuộc tính trống khi tệp nằm trong .jar.

+0

Tôi chưa bao giờ gặp sự khác biệt này trong hành vi trước đây, nhưng tôi có thể tưởng tượng một tình huống mà việc triển khai trình nạp lớp nhất định không thể diễn tả tài nguyên dưới dạng URL khi được đóng gói trong JAR. Các máy chủ tôi đã làm việc với (Jboss/Tomcat) * có thể * làm điều này, tuy nhiên. – skaffman

Trả lời

0
this.getClass().getClassLoader().getResourceAsStream(location); 
+1

Chắc chắn, tôi có thể sử dụng getResourceAsStream (vị trí) thay vì getResources (vị trí) nhưng nó không giúp tôi giải quyết hoặc hiểu vấn đề của tôi trừ khi tôi đã bỏ lỡ một cái gì đó? – Brabster

1

Mặc dù tôi có rất nhiều câu hỏi để bạn đề xuất chính xác giải pháp, tôi có thể yêu cầu bạn thử bước đơn giản này có thể giúp bạn tìm tài nguyên. Tôi tin rằng trình tải lớp mà bạn đang sử dụng để tìm tài nguyên không thể tìm thấy tài nguyên. Vì vậy, bạn có thể thử như sau (nhiều hơn một công trình xung quanh):

  1. Tạo một lớp rỗng đơn giản (ví dụ, ResourceGetter.class)
  2. Gói lớp cùng với các nguồn lực khác trong JAR. Hãy để lớp này được đóng gói ở cùng cấp phân cấp thư mục với các tài nguyên khác. Bên JAR, ví dụ:

    /resources/ResourceGetter.class

    /resources/myprop.properties ....

  3. Sử dụng ResourceGetter.class.getClassLoader() getResourceAsStream() hoặc getResources.() trong mã của bạn nơi bạn muốn các tệp tài nguyên này.

Nếu bạn có thể truy cập tài nguyên, bạn có thể tìm trình nạp lớp đã tải và bạn có thể giải quyết vấn đề của mình.

+0

Hey @sugaGenius, tôi đăng bài này sáu năm trước, tôi không thể nhớ tại sao tôi lại quan tâm đến vấn đề này, hoặc thậm chí là những gì các container! 1 để cố gắng giúp đỡ! – Brabster

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