2010-02-15 69 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"); 

希望这将帮助很多人,使他们不会有来自世界各地这需要很长的解决挑星星点点这是一个问题。