在windows和linux中是否有通用的格式/方法来定位配置文件?



在我的应用程序中,我有一个配置文件(ABC.xml),其中我们有数据库属性,log4j.xml路径和其他。在ABC.xml中,log4j.xml的路径为(D:log4j.xml),在linux中为(.\..\..\log4j.xml\)。

我们使用apache tomcat服务器,我们在服务器上下文中有ABC.xml。

是否有任何方法,使我对两个log4j的路径具有相同的表示Windows和Linux,但它将根据服务器类型相应地解释?

如果您正在使用servlet并且文件在项目中,那么在servlet中您可以:

InputStream is = getServletContext().getResourceAsStream("/log4j.xml");

java文件处理也可以处理/作为windows操作系统上的分隔符,因此您可以在ABC.xml中为linux和windows编写./../../log4j.xml(路径必须是相对的,不应该包含驱动器号)。

所以当你在代码中写

File f = new File("./../../log4j.xml");

参数"./../../log4j.xml"将在windows内部转换为".\..\..\log4j.xml"

f.getAbsolutePath();

将在windows上返回字符串"C:\some\dir\.\..\..\log4j.xml" witch打印为C:somedir.....log4j.xml,其中C:somedir是要witch .....log4j.xml相对的目录。

一种常见的方法是使用相对于系统属性的路径。这允许您以操作系统特定的格式(C:.../opt/)指定根文件夹,并稍后附加相关部分。

请注意,Java可以处理Windows和Unix的相对路径,所以new File( "C:\app", "conf/log4j.xml" )实际上会尝试打开C:appconflog4j.xml

在您的情况下,您可以使用以下代码:

File confFolder = new File( System.getProperty( "confDir" ) );
File log4j = new File( confFolder, "log4j.xml" );

另一个选项是替换配置文件中的变量名。这样你就可以有

<logConfDir>${appRoot}/conf</logConfDir>
<log4j>${logConfDir}/log4j.xml</log4j>

如果有一个系统属性logConfDir,它应该覆盖配置选项。这将允许客户做他们认为必要的事情。