Tôi đã gặp vấn đề với việc sử dụng getClass().getResource("filename.txt")
phương pháp này. Khi đọc hướng dẫn tài liệu Java, nếu tài nguyên của bạn không nằm trong cùng một gói với lớp bạn đang cố gắng truy cập tài nguyên, thì bạn phải cung cấp cho nó đường dẫn tương đối bắt đầu '/'
. Chiến lược được đề xuất là đặt các tệp tài nguyên của bạn trong thư mục "tài nguyên" trong thư mục gốc. Vì vậy, ví dụ nếu bạn có cấu trúc:
src/main/com/mycompany/myapp
thì bạn có thể thêm một thư mục tài nguyên theo đề xuất của maven trong:
src/main/resources
hơn nữa bạn có thể thêm các thư mục con trong thư mục tài nguyên
src/main/resources/textfiles
và nói rằng tệp của bạn được gọi myfile.txt
để bạn có
src/main/resources/textfiles/myfile.txt
Bây giờ đây là nơi mà vấn đề đường dẫn ngu ngốc xuất hiện. Giả sử bạn có một lớp trong đó com.mycompany.myapp package
và bạn muốn truy cập myfile.txt
tệp từ thư mục tài nguyên của mình. Một số người nói rằng bạn cần cung cấp:
"/main/resources/textfiles/myfile.txt" path
hoặc là
"/resources/textfiles/myfile.txt"
cả hai điều này đều sai. Sau khi tôi chạy mvn clean compile
, các tệp và thư mục được sao chép trong:
myapp/target/classes
thư mục. Nhưng thư mục tài nguyên không có ở đó, chỉ là các thư mục trong thư mục tài nguyên. Vì vậy, bạn có:
myapp/target/classes/textfiles/myfile.txt
myapp/target/classes/com/mycompany/myapp
vì vậy đường dẫn chính xác để cung cấp cho getClass().getResource("")
phương thức là:
"/textfiles/myfile.txt"
nó đây:
getClass().getResource("/textfiles/myfile.txt")
Điều này sẽ không trả về null nữa mà sẽ trả về lớp của bạn. Tôi hi vọng nó sẽ giúp ích cho mọi người. Thật kỳ lạ đối với tôi, "resources"
thư mục này cũng không được sao chép mà chỉ có các thư mục con và tệp trực tiếp trong "resources"
thư mục. Nó có vẻ hợp lý với tôi rằng "resources"
thư mục cũng sẽ được tìm thấy dưới"myapp/target/classes"