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.
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