System.getProperty(“catalina.base”)可能存在客户端可能使用任何其他服务器的情况
我正在使用Tomcat\conf\somename.properties
目录中的一个属性文件
String demo = System.getProperty("catalina.base") + File.separator + "conf" + File.separator + "somename.properties";
这与Tomcat完美搭配。 但是,可能存在客户端可能使用Glassfish或Websphere等任何其他服务器的情况,在这种情况下,我将无法获得System.getProperty("catalina.base")
。
我该如何妥善解决? 我能够使用ResourceBundle
做到这一点,但为此我必须将我的属性文件保存在我的构建中,这是我不想要的。 我只是想从我的构建之外读取我的属性文件。
基本上有两种方式。
-
只需将其路径添加到运行时类路径中,以便您可以通过常规方式从类路径中获取它。 对于Tomcat,您可以通过在
shared.loader
属性中指定外部文件夹来将其添加到运行时类路径中。 例如shared.loader = $ {catalina.home} / conf
或者更好,不要特定于服务器
shared.loader = / path / to / folder
其他服务器还支持将外部文件夹添加到类路径,请参阅其文档。
这样你就可以从类路径中获取它的
InputStream
,如下所示:InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("/config.properties"); Properties properties = new Properties(); properties.load(input); // ...
-
自己添加另一个与服务器无关的系统属性,可以设置为VM参数。
-Dconfig.location = /路径/到/文件夹
对于Tomcat,您可以将其设置为
JAVA_OPTS
环境变量,或编辑catalina.bat
启动文件或编辑Windows服务设置(当它作为Windows服务安装时)等。其他服务器也支持类似的结构。这样您就可以按如下方式获得它
File file = new File(System.getProperty("config.location"), "config.properties"); InputStream input = new FileInputStream(file); Properties properties = new Properties(); properties.load(input); // ...
无论您选择哪种方式,在分发应用程序时,都应该正确记录它,以便serveradmin可以相应地对其进行配置。
与此问题无关 , ResourceBundle
不是读取配置属性文件的正确方法。 它旨在用于国际化的本地化内容。
首先使用ServletContext.getServerInfo()来确定容器。 然后基于容器,使用容器特定的方式获取信息。 例如,如果方法返回“tomcat *”,那么你可以使用catalina.base的东西,如果它返回glassfish,那么使用一些glassfish特定的方法,依此类推。
简单地说,不要依赖catalina.base
,这是你的第一个问题:)
或者更准确地说,java servlet api允许您访问Web应用程序内的资源,因此您的应用程序是真正可移植的(不仅在服务器之间,而且您可以将它放在文件系统的任何位置,作为战争压缩或爆炸)
假设您将文件放在
,那么这就是您在servlet,监听器或其他Web感知类中所做的事情:
getServletContext().getResourceAsStream("/WEB-INF/somename.properties");
在这里看到类似的问题
另一种方法是使用常规的java api来搜索类路径中的文件,例如this.getClass().getResource("/somename.properties")
。 对于Web应用程序,这将在/WEB-INF/class/
或/WEB-INF/lib/
下的任何jar下找到这样的文件。
最后,如果您无法将文件放在Web应用程序中,可以将其放在硬盘驱动器上的任何位置,并使用一些配置参数(例如系统属性或web.xml中的上下文参数)来引用它。