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做到这一点,但为此我必须将我的属性文件保存在我的构建中,这是我不想要的。 我只是想从我的构建之外读取我的属性文件。

基本上有两种方式。

  1. 只需将其路径添加到运行时类路径中,以便您可以通过常规方式从类路径中获取它。 对于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); // ... 

  2. 自己添加另一个与服务器无关的系统属性,可以设置为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应用程序内的资源,因此您的应用程序是真正可移植的(不仅在服务器之间,而且您可以将它放在文件系统的任何位置,作为战争压缩或爆炸)

假设您将文件放在/WEB-INF/somename.properties ,那么这就是您在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中的上下文参数)来引用它。