Trước hết, tôi đã đọc qua nhiều S.O. câu hỏi liên quan đến chủ đề này và tôi đã thử những điều được đề xuất trong đó.Làm thế nào các nguồn lực trong một jar được biên dịch được truy cập?
Đây là tình huống của tôi. Tôi đang viết một ứng dụng Java bằng cách sử dụng khung Xử lý và tôi đang ở giai đoạn cuối cùng mà tôi cần bắt đầu suy nghĩ về việc đóng gói ứng dụng. Một tệp jar có thể thực thi được từ dòng lệnh là những gì tôi đang cố gắng xây dựng bằng cách sử dụng tính năng Xuất khẩu trong Eclipse.
Cấu trúc của dự án của tôi trông như thế này:
src/
multiple packages/
libs/
jar files and natives
data/
fonts and images
config/
json files
Khi tôi xuất file jar và uzip jar để kiểm tra nội dung của nó, tôi thấy rằng nội dung của các dirs đã được đổ ở cấp cao nhất của .jar.
nào trông như thế này:
.jar
packages
jar files
fonts
json files
Vì vậy, khi tôi cố gắng để tải một tập tin cấu hình với một cái gì đó như:
BufferedReader reader = new BufferedReader(new FileReader(path));
mọi thứ hoạt động chỉ nộp khi tôi chạy ứng dụng trong Eclipse. Nhưng tệp jar ném một số FileNotFoundException
.
Nhiều câu hỏi tôi đã thấy trên S.O. liên quan đến các vấn đề như thế này, khuyên bạn nên sử dụng class.getClass().getResource()
hoặc class.getResourceAsStream()
. Tôi đã thử cả hai đường dẫn tương đối sử dụng và chỉ tên tập tin như trong:
class.getResource('config.json');
class.getResources('cfg/config.json');
class.getResourceAsStream('../../config.json');
Tất cả những phương pháp này trả về null, khi chạy từ một trong hai Eclipse hoặc jar sử dụng:
java -jar myjarfile.jar
Tôi cũng mở để sử dụng tệp Ant. Trong thực tế, bây giờ tôi đang sử dụng tệp Ant được tạo bởi tính năng xuất để tạo jar. Nếu có cái gì đó tôi có thể thêm vào đó để thêm các thư mục vào lọ mà sẽ là tuyệt vời quá.
Cảm ơn bạn đã trả lời. Bạn có gợi ý rằng tôi sử dụng dấu gạch chéo phía trước trong một bổ sung cho getResource()? – JeremyFromEarth
Điều này dường như gần hơn. Đây là đường dẫn mà trả về: jar: file:/C: /path_to_project/myjarfile.jar! /config.json Tuy nhiên, khi tôi chạy jar tôi vẫn nhận được một tập tin không ngoại lệ mặc dù đường dẫn là chính xác. Tôi cũng nên đề cập rằng nó hoạt động từ bên trong Eclipse. – JeremyFromEarth
Bạn không thể sử dụng FileReaders với các tài nguyên bên trong các lọ. Bạn phải sử dụng InputStream được trả về từ getResourceAsSTream. –