2010-07-01 54 views
24

Vị trí tệp thuộc tính là WEB-INF/classes/auth.properties.Cách đọc tệp thuộc tính trong ứng dụng web?

Tôi không thể sử dụng các cách JSF cụ thể (với ExternalContext) vì tôi cần tệp thuộc tính trong mô-đun dịch vụ không phụ thuộc vào mô-đun web.

Tôi đã cố gắng

MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties"); 

nhưng nó sẽ trả về null.

Tôi cũng đã cố gắng đọc nó với FileInputStream nhưng nó đòi hỏi đường dẫn đầy đủ những gì là không thể chấp nhận.

Bất kỳ ý tưởng nào?

Trả lời

49

Một số lưu ý:

  1. Bạn nên thích ClassLoader như trả về bởi Thread#getContextClassLoader().

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    

    này trả về classloader parentmost trong đó có quyền truy cập vào tất cả các nguồn lực. Class#getClassLoader() sẽ chỉ trả về trình nạp lớp (con) của lớp đang được đề cập đến, điều này có thể không phải cho mỗi người có quyền truy cập vào tài nguyên mong muốn. Nó sẽ luôn hoạt động trong môi trường với một trình nạp lớp đơn, nhưng không phải lúc nào cũng trong môi trường với một hệ thống phân cấp phức tạp của các trình nạp lớp như các ứng dụng web.

  2. Thư mục /WEB-INF không nằm trong thư mục gốc của đường dẫn lớp. Thư mục /WEB-INF/classes là. Vì vậy, bạn cần tải các tệp thuộc tính liên quan đến điều đó.

    classLoader.getResourceAsStream("/auth.properties"); 
    

    Nếu bạn chọn để sử dụng Thread#getContextClassLoader(), loại bỏ các hàng đầu /.

Các JSF cụ thể ExternalContext#getResourceAsStream() trong đó sử dụng ServletContext#getResourceAsStream() "dưới mũ trùm" chỉ trả về các nguồn lực từ các WebContent (có nơi thư mục /WEB-INF đang ngồi), không phải từ classpath.

+0

không phải trong trường hợp này – unbeli

+0

@unbeli: ý của bạn là gì? – Roman

+1

@unbeli: chúc may mắn khi bạn phân phối nó dưới dạng JAR rồi :) – BalusC

8

Hãy thử điều này:

MyService.class.getClassLoader().getResourceAsStream("/auth.properties"); 

file Reading với getResourceAsStream trông trên classpath để tìm thấy tài nguyên để tải. Vì thư mục classes nằm trong đường dẫn lớp cho ứng dụng web của bạn, nên tham khảo tệp là /auth.properties sẽ hoạt động.

5

ResourceBundle (http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html) giải quyết hầu hết các sự cố với đường dẫn tương đối/bỏ sót cho Tệp thuộc tính.

Nó sử dụng lớp Tài nguyên và trỏ nó vào Lớp giả để tham chiếu đến tệp thuộc tính.

Ví dụ:

  1. Bạn có một tập tin gọi là MAINProperties.properties và bên trong nó có là một tài sản: mail.host = foo.example.com
  2. Tạo Lớp giả được gọi là MAINProperties mà không có gì.
  3. Sử dụng đoạn mã sau:.

    ResourceBundle.getBundle ("com.example.com.MAINProperties") getProperty ("mail.host")

Và Đó là nó. Không yêu cầu InputStreams.

P.D. Apache Commons có một thư viện được gọi là Apache Commons Configuration có rất nhiều khả năng (các tệp có thể tải lại, nhiều loại tên miền) có thể được sử dụng kết hợp ở trên.

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