当我将路径配置如下时,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/
我可以在application.properties文件中使用环境变量吗?
答案 0 :(得分:19)
您可以将环境变量放在属性文件中,但Java不会自动将它们识别为环境变量,因此无法解析它们。
为了做到这一点你必须解析这些值并解决你找到的任何环境变量。
您可以使用各种方法从Java获取环境变量。例如:Map<String, String> env = System.getenv();
这里有一个基本的教程:http://java.sun.com/docs/books/tutorial/essential/environment/env.html
希望有所帮助。
答案 1 :(得分:15)
这里有一些代码利用我编写的正则表达式来处理环境变量替换:
/*
* 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();
}
答案 2 :(得分:12)
这是对的。 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");
希望这会对很多人有所帮助,这样他们就不必从任何地方挑选零碎碎片,这需要很长时间才能解决手头的问题。
答案 3 :(得分:6)
或者在属性文件中使用相对路径,并通过命令行将基本目录作为系统属性加载。这样,属性文件仍然与实际部署应用程序的位置无关。
答案 4 :(得分:2)
Apache Commons项目扩展了属性文件的处理,允许你use environment variables(参见变量解释部分)。那么你应该能够得到你想要的东西:
pathToInputFile=${env:TOM_DATA}/data/incoming/ready/
答案 5 :(得分:0)
Apache Tomcat具有用于设置环境变量的可选脚本。在文档中,它说“可以在“ setenv”脚本中指定所有环境变量”(对于Windows为.bat,对于Linux为.sh)。
https://tomcat.apache.org/tomcat-9.0-doc/RUNNING.txt中的3.4节
由于它是脚本而不是静态配置,因此可以从中创建属性文件。此模式对我来说适用于在环境中配置的S3连接,但是在这里为您的示例重写了它,以及如何设置属性文件位置的好处:
cat > "${CATALINA_HOME}/conf/application.properties" <<EOF
pathToInputFile=${TOM_DATA}/data/incoming/ready/
pathToInputFileProcess=${TOM_DATA}/data/incoming/work/
EOF
CATALINA_OPTS="${CATALINA_OPTS} -DTOM_DATA=${TOM_DATA}"
CATALINA_OPTS="${CATALINA_OPTS} -Dapplication.properties.location=${CATALINA_HOME}/conf/application.properties"
export CATALINA_OPTS
如果您配置运行时诸如内存限制,无头模式或要使用的垃圾收集之类的内容,则您可能已经在使用此文件。
注意::文档中有关于何时不调用setenv的警告,以及一些无法在其中配置的环境变量的例外。