2010-02-15 38 views
20

Trong tệp application.properties của tôi nếu tôi có đường dẫn được cấu hình như dưới đây Java nhận dạng đường dẫn thành công.Về tệp application.properties và biến môi trường

pathToInputFile=/kcs/data/incoming/ready/ 
pathToInputFileProcess=/kcs/data/incoming/work/ 

Nếu tôi có cách dưới đây sử dụng chương trình biến Java môi trường không nhận ra con đường

biến môi trường TOM_DATA được thiết lập như/KCS

pathToInputFile=${TOM_DATA}/data/incoming/ready/ 
pathToInputFileProcess=${TOM_DATA}/data/incoming/work/ 

Tôi có thể sử dụng biến môi trường bên trong ứng dụng .properties tệp?

Trả lời

15

Bạn có thể đặt biến môi trường trong tệp thuộc tính của mình, nhưng Java sẽ không tự động nhận ra chúng dưới dạng biến môi trường và do đó sẽ không giải quyết chúng.

Để làm điều này bạn sẽ phải phân tích các giá trị và giải quyết bất kỳ biến môi trường nào bạn tìm thấy.

Bạn có thể nhận các biến môi trường từ Java bằng nhiều phương pháp khác nhau. Ví dụ: Map<String, String> env = System.getenv();

Có một hướng dẫn cơ bản ở đây: http://java.sun.com/docs/books/tutorial/essential/environment/env.html

Hope đó là giúp đỡ một số.

5

Có một cái nhìn tại Commons configuration

Hoặc cách khác sử dụng đường dẫn tương đối trong tài sản của bạn tập tin, và tải các thư mục cơ sở thông qua dòng lệnh như một thuộc tính hệ thống. Bằng cách đó, các tệp thuộc tính vẫn độc lập với nơi ứng dụng thực sự được triển khai.

14

Câu trả lời của Tom Duckering là chính xác. Java không xử lý điều này cho bạn.

Dưới đây là một số mã sử dụng biểu thức thông thường mà tôi đã viết để xử lý thay thế biến môi trường:

/* 
* Returns input string with environment variable references expanded, e.g. $SOME_VAR or ${SOME_VAR} 
*/ 
private String resolveEnvVars(String input) 
{ 
    if (null == input) 
    { 
     return null; 
    } 
    // match ${ENV_VAR_NAME} or $ENV_VAR_NAME 
    Pattern p = Pattern.compile("\\$\\{(\\w+)\\}|\\$(\\w+)"); 
    Matcher m = p.matcher(input); // get a matcher object 
    StringBuffer sb = new StringBuffer(); 
    while(m.find()){ 
     String envVarName = null == m.group(1) ? m.group(2) : m.group(1); 
     String envVarValue = System.getenv(envVarName); 
     m.appendReplacement(sb, null == envVarValue ? "" : envVarValue); 
    } 
    m.appendTail(sb); 
    return sb.toString(); 
} 
8

Đó là đúng. Java không xử lý thay thế giá trị của các biến môi trường. Ngoài ra Java có thể không nhận ra các biến như $ EXT_DIR. Trong khi sử dụng các biến số như vậy, bạn có thể gặp phải FileNotFoundException. Nhưng Java sẽ nhận ra các biến được định nghĩa với -D trong catalina.sh. Những gì tôi có nghĩa là bằng cách này, là giả sử bạn có một định nghĩa như vậy trong catalina.sh

CATALINA_OPTS="-Dweb.external.dir="$EXT_DIR" 

Trong tài sản của bạn tập tin sử dụng $ {} web.external.dir thay vì sử dụng * $ EXT_DIR * . Và trong khi truy cập thuộc tính này trong mã của bạn, bạn có thể làm theo cách này:

String webExtDir = System.getProperty("web.external.dir"); 

Hy vọng điều này sẽ giúp rất nhiều người dân vì vậy họ sẽ không phải chọn bit và miếng từ khắp mọi nơi mà có rất dài để giải quyết một vấn đề trong tầm tay.

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