【问题标题】:modify properties file in Tomcat during runtime在运行时修改 Tomcat 中的属性文件
【发布时间】:2012-02-19 16:34:59
【问题描述】:

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

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 实例中添加/更改属性的正确方法还是我应该采取不同的方法?如果是后者,如何做到最好?

非常感谢您的回答!

【问题讨论】:

  • 尝试用getPortletContext().getRealPath(relativePath+fileName)替换FileOutputStream out = new FileOutputStream(file); 中的file

标签: java tomcat tomcat7


【解决方案1】:

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

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

  1. 确定运行时属性文件所在的“已知”位置 托管,或允许部署者通过井指定此位置 已知财产。
  2. 尝试从该位置读取您的属性文件。如果确实如此 不存在,从存储在其中的模板创建并初始化它 您的申请。
  3. 将应用程序执行期间所做的所有更改保存到此 外部属性文件。

使用此设置,您永远不必担心无法写入文件,或者它会被容器覆盖。

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 2016-11-04
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多