2012-01-27 11 views
8

Tôi đã phá vỡ vấn đề này trong một thời gian ngắn và không thể tìm thấy giải pháp cho vấn đề này:Tệp và bundleresource: // URL

Tôi có ứng dụng RCP Eclipse sử dụng thư viện tùy chỉnh được đóng gói làm jar. Từ plugin, tôi đang gọi một phương thức trong jar. Trong phương pháp này, tôi đang "nhận" tài nguyên bằng cách sử dụng this.class.getResource(relPath), trong khi relPath là đường dẫn tương đối được mã hóa cứng vào tệp tôi cần. Điều này trả về cho tôi một số URL mà tôi có thể sử dụng để xây dựng một số File.

Bây giờ, điều này hoạt động hoàn hảo nếu tôi không gọi phương thức này từ plugin, nhưng từ một chương trình Java đơn giản. Sự khác biệt: Trình tải lớp của Eclipse RCP trả về một giao thức URLbundleresource:// không được hỗ trợ bởi File, trong khi khi chạy một chương trình Java đơn giản, trả lại số file:// -URL là hoàn toàn phù hợp để xây dựng File.

Tôi biết lớp FileLocator của Eclipse SDK (giải quyết bundleresource-URL tới tệp-URL), nhưng tôi không thể sử dụng nó trong thư viện vì tôi không muốn kết nối nó với nền tảng RCP Eclipse - nó cũng có thể sử dụng lib này từ các nguồn không phải của Eclipse-RCP. Bất cứ ai có ý tưởng về cách tôi có thể tải tài nguyên này từ một đường dẫn tương đối theo cách sẽ làm việc cả khi phương thức này được gọi từ một RCP-Plugin Eclipse hoặc bất kỳ ứng dụng khách nào khác không ?.

Tôi cần phải xây dựng một File trên thư mục của đường dẫn tương đối này để tìm kiếm tệp bên trong. Tôi hoàn toàn bị mắc kẹt trên này ...

CẬP NHẬT: Nếu có một khả năng khác so với sử dụng File#list() để có được nội dung thư mục này sẽ đã giúp tôi ..

bất kỳ gợi ý đánh giá cao rất nhiều,

+0

Bạn có thể liệt kê mã có liên quan không? –

+0

@TonnyMadsen Hm, tôi có thể nhưng về cơ bản nó rất đơn giản: Tôi đang sử dụng this.getClass(). GetResource (relPath) để tải một đường dẫn trong lớp con của tôi. Điều này trả về cho tôi một URL bundleresource: // khi được thực hiện theo Eclipse RCP và một tệp: // URL khác. Cố gắng tạo một đối tượng tệp không thành công với URL bundleresource: // vì Tệp không hỗ trợ giao thức này. Vì tôi cần đọc nội dung thư mục của "relPath" nên tôi buộc phải sử dụng Tệp ... – quaylar

+0

Làm cách nào để chuyển đổi URL thành Tệp? –

Trả lời

12

Bạn không thể đơn giản đảo ngược sự phụ thuộc. I E., Mô-đun của bạn lấy các tài nguyên như URL định nghĩa một giao diện

interface Locator { URL resolve(URL url); } 

và bạn có thể sử dụng một cài đặt mặc định

class StandaloneLocator implements Locator { 
    public URL resolve(URL url) { return url; } 
} 

Trong trường hợp của Eclipse, định vị mặc định này là để được thay thế bằng

class EclipseLocator implements Locator { 
    public URL resolve(URL url) { return FileLocator.resolve(url); } 
} 

Bây giờ, thư viện của bạn không phụ thuộc vào Eclipse, và bạn vẫn có thể sử dụng FileLocator. Vì bạn sẽ không nhận được bất kỳ bundleresource-URLs nào với Eclipse, điều này sẽ hoạt động.

Chúc mừng, Jens

+0

Tôi đã tự giải quyết vấn đề trước khi trả lời, nhưng đây là một ý tưởng thực sự tốt! Đánh giá cao nó và có thể refactor nó trong thời gian tới :) – quaylar

0

Không thể liệt kê các tệp trong tệp jar bằng các phương thức từ Class. Bạn cần tạo tệp resourcelist chứa tất cả tên tài nguyên của bạn hoặc mở tệp jar như lưu trữ zip và liệt kê các tệp như trong kho lưu trữ zip. File lớp không thể xử lý các giao thức khác ngoài file://. Nếu nguồn cấp của bạn nằm trong tệp jar, bạn nên sử dụng lớp Url và nhận luồng bằng phương pháp Url.openSteram để nhận nội dung tệp.

UPD liên quan đến việc chạy ứng dụng java đơn giản: bạn có thể không gói nó vào tệp jar, vì vậy lớp và tài nguyên của bạn được đặt trong hệ thống tệp và không lưu trữ. Đó là lý do tại sao bạn nhận giao thức file://. Nếu bạn gói vào tệp jar, giao thức sẽ không được file:// nó sẽ là jar:// (không chắc chắn về tên giao thức chính xác).

+0

Đánh giá cao câu trả lời của bạn, nhưng tệp/tài nguyên không nằm trong một cái bình, nhưng trong một thư mục trong đường dẫn lớp của ứng dụng. Liên quan đến Url.openStream(): Rất tiếc là không thể đọc nội dung thư mục bằng phương pháp này (tôi cần tải thư mục làm tài nguyên và kiểm tra các tệp hiện có). – quaylar

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