System.getProperty“ catalina.base”可能存在客户端可以使用任何其他服务器的情况

问题描述

| 我正在使用从
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中的上下文参数)来引用该文件。