问题描述
|
我正在使用从
Tomcat\\conf\\somename.properties
目录中读取属性文件
String demo = System.getProperty(\"catalina.base\") +
File.separator + \"conf\" + File.separator + \"somename.properties\";
这与Tomcat完美配合。但是,在某些情况下,客户端可能会使用任何其他服务器,例如Glassfish或Websphere,在这种情况下,我将无法获得2英镑。
我应该如何正确解决?我可以使用ResourceBundle
来做到这一点,但是为此我必须将我的属性文件保留在我的构建中,这是我不想要的。我只想从我的构建外部读取属性文件。
解决方法
基本上有两种方法。
只需将其路径添加到运行时类路径中,就可以以通常的方式从类路径中获取它。对于Tomcat,可以在
/conf/catalina.properties
的shared.loader
属性中指定外部文件夹,以将其添加到运行时类路径。例如。
shared.loader = $ {catalina.home} / conf
或更妙的是,不要特定于服务器
shared.loader = /路径/到/文件夹
其他服务器还支持将外部文件夹添加到类路径,请参阅其文档。
这样,您就可以从类路径中获取它的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 Service设置(将其安装为Windows Service时),等等。其他服务器也支持类似的结构。
这样您可以获得如下
File file = new File(System.getProperty(\"config.location\"),\"config.properties\");
InputStream input = new FileInputStream(file);
Properties properties = new Properties();
properties.load(input);
// ...
无论采用哪种方式,在分发应用程序时,都应正确记录下来,以便serveradmin可以相应地对其进行配置。
与问题无关,“ 3”不是读取配置属性文件的正确方法。它旨在本地化内容以进行国际化。
,首先使用ServletContext.getServerInfo()确定容器。然后基于容器,使用特定于容器的方式来获取信息。例如如果该方法返回\“ tomcat * \”,则可以使用catalina.base的东西,如果它返回glassfish,则可以使用一些特定于glassfish的方式,依此类推。
,简而言之,不要依靠catalina.base
,这是您的第一个问题:)
或者,更准确地说,java servlet api使您可以访问Web应用程序中的资源,因此您的应用程序是真正可移植的(不仅在服务器之间,而且还可以将其放置在文件系统中的任何位置,压缩成战争或爆炸状)。
假设您将文件放在<webapp-root>/WEB-INF/somename.properties
,那么这就是您在servlet,侦听器或其他可识别网络的类中执行的操作:
getServletContext().getResourceAsStream(\"/WEB-INF/somename.properties\");
在这里看到类似的问题。
另一种选择是使用常规的Java api搜索类路径中的文件,例如this.getClass().getResource(\"/somename.properties\")
。对于Web应用程序,它将在/WEB-INF/class/
下找到这样的文件,或者在/WEB-INF/lib/
下找到任何jar。
最后,如果您无法将文件放入Web应用程序中,则可以将其放在硬盘驱动器上的任何位置,并使用一些配置参数(例如,系统属性或web.xml中的上下文参数)来引用该文件。