在运行时期间修改Tomcat中的属性文件

时间:2012-02-19 16:34:59

标签: java tomcat tomcat7

我想在运行时修改Portlet的属性文件。 portlet部署在Tomcat 7.0.23中,属性文件位于“/ WEB-INF / classes / content”中,我可以通过下面的代码访问它。实际上,代码在没有任何异常的情况下执行,但新添加的属性不会保存到属性文件中。

String fileName = "MyProps.properties";
String relativePath = "/WEB-INF/classes/content/";
String fullPath = "c:/tomcat-7.0.23/webapps/my-portlet/WEB-INF/classes/content/";
try {
    String path = relativePath + fileName;
    InputStream in = getPortletContext().getResourceAsStream(path);
    Properties props = new Properties();
    props.load(in);
    props.setProperty("test", "test");
    File file = new File(fullPath + fileName));
    FileOutputStream out = new FileOutputStream(file);
    props.store(out, "");
} catch(Exception ex) { // error handling here}

添加新属性后,我可以用

进行验证
props.list(System.out);

它确实被添加了。 context.xml文件包含以下条目:

 antiJARLocking="true"
 antiResourceLocking="true"

这是在正在运行的Tomcat实例中添加/更改属性的正确方法,还是应该采用不同的方法?如果是后者,怎么能最好地实现呢?

非常感谢你的回答!

1 个答案:

答案 0 :(得分:4)

您绝对应该 依赖于能够更改已部署的Web应用中包含的文件。此时控制已被移交给容器,文件可能被覆盖,或者甚至可能无法写入。它还给应用程序部署者带来了负担,因为现在他们不能简单地吹走爆炸的WAR文件夹(如果存在)并重新部署存档。

作为您的方法的替代方法,请考虑将属性文件放在Web应用程序外部的位置。我见过的成功使用的一种方法是:

  1. 确定运行时属性文件所在的“众所周知的”位置 托管,或允许部署者通过井指定此位置 已知财产。
  2. 尝试从此位置读取您的属性文件。如果是的话 不存在,从存储在其中的模板创建和初始化它 你的申请。
  3. 将应用程序执行期间所做的所有更改保存到此 外部财产文件。
  4. 使用此设置,您永远不必担心无法写入文件或被容器覆盖。