2012-09-05 44 views
11

Cách thực hành tốt nhất để đọc (các) tệp cấu hình cho ứng dụng của bạn là gì. Những thư mục nào trong máy chủ tomcat là "trên classpath".Đọc thuộc tính từ tomcat

Tôi đã thử đặt tệp cấu hình của mình trong số TOMCAT_HOME\conf nhưng tôi vẫn không thể đọc nó từ servlet của mình.

Cố gắng sử dụng này (có app.properties tập tin trong conf):

this.getClass().getClassLoader().getResourceAsStream("/app.properties"); 

Tôi không có nhiều đặc tính có lẽ 10-15 I figured này sẽ không vấn đề. Tôi nhớ khi tôi đang sử dụng jboss, đây không phải là vấn đề như thế này.

Trong ứng dụng của mình, tôi cũng chỉ định kết nối DB mùa xuân trong context.xml tôi có thể chỉ định các thuộc tính của mình trong đó cũng bằng cách nào đó không? Hoặc làm thế nào điều này làm việc với tomcat?

Tôi muốn giữ cho các thuộc tính của mình tách biệt khỏi chiến tranh/cuộc chiến không giải nén của tôi.

Cập nhật

Lý do yêu cầu này là bởi vì tôi không biết nơi ứng dụng của tôi sẽ được triển khai (vào những gì vị trí)

Trả lời

18

Có rất nhiều cách khác nhau nhưng nó phụ thuộc vào nhu cầu của bạn:

Để tải một tập tin bất động sản từ $TOMCAT_HOME/conf thư mục mà bạn sẽ cần phải truy cập vào nó sử dụng một đối tượng java.io.File kể từ khi bộ nạp lớp (như trong this.getClass().getClassLoader().getResourceAsStream(...) chỉ là thể tải file (và các lớp học) từ đường dẫn lớp học của bạn (dưới WEB-INF/classes, WEB-INF/lib hoặc $TOMCAT_HOME/lib)

Ví dụ đơn giản nhất để tải một tập tin từ thư mục config của Tomcat sẽ là:.

File configDir = new File(System.getProperty("catalina.base"), "conf"); 
File configFile = new File(configDir, "myconfig.properties"); 
InputStream stream = new FileInputStream(configFile); 
Properties props = new Properties(); 
props.load(stream); 

Lưu ý rằng cách tiếp cận này sẽ làm cho mã của bạn phụ thuộc vào Tomcat (cơ chế tải phụ thuộc vào thực tế thuộc tính hệ thống của Tomcat có sẵn). Đây là điều mà tôi không khuyến cáo ở tất cả vì vậy nếu bạn di chuyển tệp thuộc tính của bạn vào một thư mục bên trong đường dẫn lớp học của bạn thì bạn sẽ có thể tải nó theo cách bạn đã thử và ứng dụng của bạn có thể được triển khai trong bất kỳ vùng chứa nào.

Và, bạn có thể định cấu hình các thuộc tính của mình làm tài nguyên JNDI nhưng sẽ quá phức tạp để truy cập chúng.

+0

Đây không phải là vị trí mà thuộc tính ứng dụng phải là. –

+3

Tôi biết nhưng nếu anh ta muốn đặt chúng ở đó là tùy thuộc vào anh ta, tôi sẽ cho anh ta manh mối để có được nó và một đề nghị để di chuyển nó đến một classpath có sẵn thư mục –

+0

Đó là tốt bây giờ. –

0

Theo như tôi biết bạn có thể cấu hình datasource trong tomcat cũng có. DataSource in Tomcat

Sau này, bạn có thể sử dụng datasource trong đơn đăng ký của mình.

+0

cảm ơn cho câu trả lời. Tôi không cần nguồn dữ liệu Tôi có một phần cấu hình đã được tôi cần thêm tài sản –

+0

Sau đó, tôi đoán bất cứ điều gì bạn đang làm là tốt. Không có vấn đề nơi ứng dụng được triển khai trong cấu trúc thư mục tomcat của các tập tin trích xuất là như vậy nếu app.properties được vận chuyển đúng với triển khai sau đó nó sẽ không gây ra bất kỳ vấn đề. –

1

Đặt tệp của bạn trong ứng dụng web WEB-INF/classes. Đây là thư mục classpath mặc định. conf nếu chỉ dành cho nội bộ Tomcat.

0

Mặc dù nó có thể là một PITA, nó có lẽ cũng là một tính năng mà bạn không biết nó sẽ được triển khai ở đâu. Bạn không thể "cặp" chính mình vào thực tế đó!

Tùy thuộc vào phần còn lại của ngăn xếp Java của bạn, cách tốt nhất thường là độc lập với Tomcat.Nếu bạn đang sử dụng Spring, bạn có thể nói ví dụ:

new ClassPathResource("**/myFile.properties") 

hoặc nếu sử dụng Java Config, một ví dụ khác:

@PropertySource("classpath:META-INF/MyWeb.properties") 

Trong đồng bằng Java bạn có thể nói:

InputStream stream = loader.getResourceAsStream(resourceName); 

nơi bộ nạp là một phiên bản của ClassLoader

1

Thay vì đề cập đến vị trí của tệp cấu hình cụ thể, tôi sẽ se cấu hình ràng buộc JNDI, để giữ cho các ứng dụng phụ thuộc vào dữ liệu cấu hình và các tiêu chuẩn Java EE. Tôi có thể thấy hai lựa chọn:

  1. Nếu bạn chỉ có một số lượng vừa phải các mục cấu hình trong tập tin tài sản của bạn, sau đó xem xét làm cho chúng Environment Entries và truy cập chúng qua JNDI trong các ứng dụng của bạn. Ngoài ra, trong trường hợp bạn muốn giữ các thuộc tính của bạn trong một tệp thuộc tính riêng biệt, bạn cũng có thể tạo một bean để biểu diễn các thuộc tính, một nhà máy (khởi tạo bean bằng một tệp thuộc tính) và móc nó lên JNDI. dưới dạng Resource Definition.
    Với điều đó, người ta thậm chí có thể thường xuyên đọc lại tệp thuộc tính mà không cần khởi động lại ứng dụng, chuyển đổi giữa các nguồn cấu hình khác nhau hoặc các yêu cầu tương tự khác.

Mỗi ứng dụng web sử dụng cấu hình này sẽ phải bao gồm một Resource Reference trong nó web.xml để chỉ đậu cấu hình (hoặc một tham chiếu đến mỗi mục env. Nếu tùy chọn 1 được sử dụng).

0

thêm .properties tập tin trong apache-tomcat-7.0.78 \ conf thư mục:

File configDir = new File(System.getProperty("catalina.base"), "conf"); 
File configFile = new File(configDir, "dashboardiframes.properties"); 
InputStream stream = new FileInputStream(configFile);Properties properties = new Properties(); 
properties.load(stream); 
Các vấn đề liên quan