我正在使用
从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
来做到这一点,但为此我必须将我的属性文件保存在我的构建中,这是我不想要的。我只是想从我的构建之外读取我的属性文件。
答案 0 :(得分:16)
基本上有两种方式。
只需将其路径添加到运行时类路径中,以便您可以通常的方式从类路径中获取它。对于Tomcat,您可以通过在shared.loader
/conf/catalina.properties
属性中指定外部文件夹,将外部文件夹添加到运行时类路径中。 E.g。
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=/path/to/folder
如果是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
是读取配置属性文件的正确方法。它旨在用于国际化的本地化内容。
答案 1 :(得分:1)
首先使用ServletContext.getServerInfo()确定容器。然后基于容器,使用容器特定的方式获取信息。对于例如如果方法返回“tomcat *”,那么你可以使用catalina.base的东西,如果它返回glassfish,那么使用一些glassfish特定的方法,等等。
答案 2 :(得分:0)
简单地说,不要依赖catalina.base
,这是你的第一个问题:)
或者更确切地说,java servlet api允许您访问Web应用程序内的资源,因此您的应用程序真正可移植(不仅在服务器之间,而且您可以将它放在文件系统的任何位置,作为战争压缩或爆炸)
假设您将文件放在<webapp-root>/WEB-INF/somename.properties
,那么这就是您在servlet,监听器或其他Web感知类中所做的事情:
getServletContext().getResourceAsStream("/WEB-INF/somename.properties");
查看类似问题here。
另一种方法是使用常规java api来搜索类路径中的文件,例如this.getClass().getResource("/somename.properties")
。对于Web应用程序,这将找到/WEB-INF/class/
下的/WEB-INF/lib/
或{{1}}下的任何jar文件。
最后,如果你不能把文件放在你的web应用程序中,你可以把它放在硬盘上的任何地方并使用一些配置参数(例如系统属性或web.xml中的上下文参数)来引用它