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

时间:2011-05-24 15:55:44

标签: java

我正在使用

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

3 个答案:

答案 0 :(得分:16)

基本上有两种方式。

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

  2. 自己添加另一个与服务器无关的系统属性,您可以将其设置为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);
    // ...
    

  3. 您选择的方式是,在分发应用程序时,您应正确记录,以便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中的上下文参数)来引用它