2013-04-12 16 views
5

Tôi đang cố gắng đọc từ một tệp được đóng gói bên trong một JAR, cùng với lớp đọc nó. Để làm điều này, tôi sử dụng như sau:Đọc tập tin từ bên trong JAR không hoạt động trên windows

getClass().getClassLoader().getResourceAsStream(file) 

này hoạt động tốt khi tôi có thể tạo và chạy các tập tin JAR trên OSX, nhưng nếu tôi có thể tạo và chạy các tập tin JAR trên cửa sổ, dòng trên trả về null.

Tôi có thiếu gì đó ở đây không? Nếu tôi tạo JAR trên OSX và chạy nó trên Windows nó hoạt động tốt. Vấn đề chỉ xảy ra khi tôi tạo JAR trên cửa sổ.

EDIT: Điều đáng nói đến là không có phân cấp thư mục nào trong tệp JAR. Tất cả mọi thứ được lưu trữ ở một mức độ, do đó các lớp đọc tập tin và tập tin chính nó là cả hai trong cùng một thư mục. Ngoài ra, đây là cách tôi tạo tệp JAR, trên cả OSX và Windows:

jar -cmf manifest.mf run.jar *.class file1 file2 

EDIT 2: Tệp tôi đang cố gắng tải là tệp java .properties. Tôi lấy nó không phải là nguyên nhân gây ra vấn đề?

+0

Tệp Jar là tệp zip, vì vậy bạn có thể sử dụng tệp đó để xác minh phiên bản do Windows tạo. Đổi tên nó bằng một .zip và sau đó duyệt bên trong bằng Windows Explorer. –

+0

@NathanielWaisbrot xác minh chính xác những gì? Đó là tất cả các tệp ở đó? Tôi đã kiểm tra (sử dụng jar -tf thay thế), và chúng chắc chắn là tất cả ở đó, trong cấu trúc mà tôi đã mô tả trong câu hỏi – Kumalh

+0

Bạn nói rằng một chiếc jar được xây dựng trên Mac hoạt động trên Windows, nhưng một chiếc jar được xây dựng trên Windows không hoạt động. Khác biệt nội dung của hai tệp jar. Nếu bạn đang sử dụng cùng một phiên bản Java, tôi nghĩ rằng các tệp .class phải giống nhau. –

Trả lời

0

Bỏ qua phần trình nạp lớp. Chỉ cần getClass(). GetResource ....

+0

Tôi muốn 'Classloader.getSystemResource()' –

+0

Tôi đã thử điều đó. Kết quả tương tự: hoạt động trên OSX chứ không phải trên Windows. Tôi cũng đã thử 'this.getClass(). GetResourceAsStream (" \ file ");', nhưng điều đó không hoạt động hoặc là – Kumalh

+0

Aha! Không sử dụng bất kỳ dấu phân tách đường dẫn nào. Chỉ tên tệp. –

0

Dùng thử theo cách này getClass(). GetResourceAsStream ("/ file1").