2009-05-09 8 views
5

Có thể thêm một thư mục tương đối (ví dụ: foo/bar/plugh) vào classpath java và sử dụngthêm một thư mục tương ứng với java classpath và sử dụng ClassLoader(). GetResourceAsStream ("")

InputStream in = getClassLoader().getResourceAsStream("xyzzy.properties"); 

Để tìm nạp foo/bar/plugh/xyzzy.properties?

classpath của tôi trông như thế này:

foo.jar;foo/bar/plugh;xyz.jar 

Và tôi có thể sử dụng các lớp học và các nguồn lực từ cả hai foo và xyz lọ nhưng không phải từ thư mục plugh. Trong những trường hợp đó, in luôn là rỗng.

Tôi không thể làm điều này để làm việc và không chắc chắn nếu điều này chỉ là không được hỗ trợ, tôi thiếu một cái gì đó tinh tế hoặc nếu tôi đang làm điều gì đó sai trái. Tôi có cần sử dụng đường dẫn tuyệt đối không?

+0

Bạn đã đặt đường dẫn lớp này như thế nào? Giống như ví dụ sau? java -classpath foo.jar; foo/bar/plugh; xyz.jar –

Trả lời

6

Có lẽ tôi hiểu lầm những gì bạn đang cố gắng làm, nhưng nếu bạn có một thư mục trong classpath của bạn, điều đó có nghĩa là tất cả các tệp bên dưới nó cũng phải ở trong classpath. Nếu không, bạn luôn có thể vượt qua từng tệp .properties trên đường dẫn lớp.

Nhưng một trong hai cách, từ các tập tin/thư mục chứa các tập tin là trong classpath, bạn nên chỉ có thể làm:

InputStream in = new FileInputStream("classpath:xyz.properties") 

Và kể từ khi "foo/bar/plugh" là trong classpath , một trong những nơi mà nó sẽ tìm kiếm xyz.properties là trong "foo/bar/plugh".

+0

Vì lý do nào đó, tính năng này không hoạt động đối với tôi khi ứng dụng của tôi chạy qua một tập tin batch được tạo bởi codehaus maven appassmebler. Đường dẫn tuyệt đối hoạt động nhưng đường dẫn tương đối thì không. – sal

+2

Điều duy nhất tôi có thể nghĩ là nếu đường dẫn tương đối mà bạn có trong classpath của bạn đang được giải quyết dựa trên nơi chương trình được chạy. Ví dụ: nếu tôi có tệp lô trong thư mục C: \ myapp \ bin, đường dẫn "cơ sở" có thể là C: \ myapp \ bin, không phải C: \ myapp. Nếu đúng như vậy, nó sẽ cố giải quyết "C: \ myapp \ bin \ foo \ bar \ plugh \ xyz.properties". –

+0

Nó làm việc cho tôi với đường dẫn tuyệt đối của thư mục. Nhưng nó rất lạ vì tôi đã thử trước đó với mã: InputStream in = getClassLoader().getResourceAsStream("xyzzy.properties"); Sự khác biệt giữa hai phương pháp này là gì? Cảm ơn. –