在我的应用程序中,我有一个配置文件(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
,它应该覆盖配置选项。这将允许客户做他们认为必要的事情。