2010-07-13 30 views
6

Hallo,getResourceAsStream không thành công trong môi trường mới?

tôi có dòng mã sau đây:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

và tôi biết rằng jar với com/thinkplexx/lang/de/general.xml là trong classpath.

Nó hoạt động trong "môi trường trước", đó là xây dựng maven2.

Bây giờ, tôi đánh giá maven3 và nó không hoạt động! Tôi biết rằng nếu tôi thay đổi mã thành:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("com/thinkplexx/lang/de/general.xml"); 

nó hoạt động rất lớn (tôi vừa xóa dấu gạch chéo đầu tiên khỏi đường dẫn tài nguyên).

Btw, tôi sử dụng Linux. Dấu gạch chéo đầu tiên trong đường dẫn thường có nghĩa là "từ thư mục gốc", vì vậy nếu logic này là âm thanh cho tải tài nguyên java là tốt, ví dụ đầu tiên không bao giờ nên làm việc !?

Câu hỏi: có vấn đề gì với mẫu mã đầu tiên, tức là với /com/ chứ không phải com/? Nó chỉ là mã xấu hay nó có ý nghĩa gì đó khác?

cảm ơn bạn!

+0

Câu trả lời của Devons phù hợp với tôi. Ngoài ra, tôi tìm thấy trong http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/guide/lang/resources.html rằng: " Các phương pháp trong ClassLoader sử dụng Chuỗi đã cho là tên của tài nguyên mà không áp dụng bất kỳ phép biến đổi tuyệt đối/tương đối nào (xem các phương thức trong Lớp). Tên không được có "/" hàng đầu. " –

Trả lời

7

Điều đó tùy thuộc vào cách bạn nhận được tài nguyên. Khi bạn sử dụng số ClassLoader như sau:

InputStream stream= getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

Hàng đầu '/' là vô nghĩa. Vì vậy, biểu mẫu chính xác là "com/thinkplexx/lang/de/general.xml".

Nếu, thay vào đó bạn sử dụng một 'Class', như trong:

InputStream stream= getClass().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

Bạn nhận được một hành vi khác nhau. Class.getResourceAsStream sẽ xem xét các lớp học không có '.' liên quan đến gói chứa lớp. Tài nguyên được chỉ định với 'hàng đầu'. tuyệt đối hoặc được giải quyết liên quan đến gốc của bình.

Vì vậy, nếu this là một tham chiếu đến com.example.SomeThing, sau đó hành vi dự kiến ​​là:

getClass().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> a/b/c.xml 
getClass().getResourceAsStream("a/b/c.xml") ==> com/example/a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("a/b/c.xml") ==> a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> Incorrect 

Maven2 đã bị lỏng lẻo và cho phép các hình thức cuối cùng.

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