如何从部署为.war文件并在Tomcat 5.5中运行的servlet访问配置文件?

时间:2009-06-01 15:40:25

标签: java tomcat

我正在尝试从.war文件中的servlet访问配置文件。问题是,默认文件路径是tomcat root本身,并且硬编码文件的路径似乎也不是一个选项。是否可以通过ServletContext或任何Tomcat变量获取任何信息?

3 个答案:

答案 0 :(得分:1)

如果您将文件放在特定webapps目录下的'classes'目录下(./webapps/{servlet}/classes),那么您可以通过这样做从Java类中访问它:

Class.getResourceAsStream(<filename>);

所以如果你在/webapps/myServlet/classes/conf.xml上有一个conf文件

Class.getResourceAsStream("conf.xml");

答案 1 :(得分:1)

甘道夫提供了“正确”的答案。你可以在任何地方安全使用它。这就是你所需要的一切。

请注意。有些人认为,因为有一些方法可以从WAR内部读取数据,这意味着在WAR内部写入数据也是可以的。从字面意义上讲,有时候这是真的。但不总是。它几乎绝对不安全。

我之所以提到这一点是因为我继承了一个完全正确的webapp。在爆炸的WAR目录中存储整个目录文件树。首次软件升级,“噗!”所有那些精心上传的数据文件都已消失。

因此将WAR视为只读。如果需要编写,请在应用程序服务器外指定一个目录。最好作为web.xml文件中的可配置参数,以便您可以使用JNDI查找它,并且可以覆盖它以进行测试,而无需修改源代码。

答案 2 :(得分:0)

我完全不确定这是“正确”的事情,但在过去,我已经为我的配置文件的路径读取了一个环境变量。

这样的事情(你应该更好地处理异常而不是这个例子......但是你明白了这一点):

public File getConfigurationFile() {
   String envPath = System.getEnv("CONFIG_FILE"); // Use a better-named variable
   if(envPath == null || envPath.equals("") {
      throw new RuntimeException("CONFIG_FILE environment variable not set.");
   } else {
      File f = new File(envPath);
      if(!f.exists())  {
       throw new RuntimeException("CONFIG_FILE environment variable points to non-existent file");
      } else if(!f.isFile()) {
       throw new RuntimeException("CONFIG_FILE environment variable points to non-file entity.");
      } else if(!if.canRead()) {
       throw new RuntimeException("CONFIG_FILE points to unreadable file.");
      } else {
        return f;
      }
   }
}