2010-02-15 66 views
20

在我的application.properties文件中,如果我的路徑如下配置Java成功識別路徑。關於application.properties文件和環境變量

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

如果非要使用環境變量Java程序不能識別路徑以下方式

環境變量TOM_DATA設爲/ KCS

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

我可以使用裏面的應用程序環境變量.properties文件?

回答

15

您可以將環境變量放在屬性文件中,但Java不會自動將它們識別爲環境變量,因此無法解析它們。

爲了做到這一點將不得不分析值,並解決你找到的任何環境變量。

您可以使用各種方法從Java獲取環境變量。例如:Map<String, String> env = System.getenv();

有一個基本的教程在這裏:http://java.sun.com/docs/books/tutorial/essential/environment/env.html

希望這是一些幫助。

5

看一看Commons configuration

或可選擇地使用相對路徑的屬性文件,並加載通過命令行的基本目錄的系統屬性。這樣,屬性文件保持獨立於應用程序實際部署的位置。

14

Tom Duckering的回答是正確的。 Java不會爲你處理這個問題。

下面是利用我寫來處理環境變量替換正則表達式的一些代碼:

/* 
* 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

這是正確的。 Java不處理替代環境變量的值。 另外Java可能不會識別變量,如$ EXT_DIR。在使用您可能遇到的這些變量時FileNotFoundException。 但Java會認識到,在catalina.sh-D定義的變量。我這個意思,是假設你有這樣的定義在catalina.sh

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

在你的屬性文件中使用$ {} web.external.dir而是採用* $ EXT_DIR * 。 雖然在代碼中訪問這個屬性,你可以這樣來做:

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

希望這將幫助很多人,使他們不會有來自世界各地這需要很長的解決挑星星點點這是一個問題。