изменить файл свойств в Tomcat во время выполнения - PullRequest
2 голосов
/ 19 февраля 2012

Я хотел бы изменить файл свойств портлета во время выполнения. Портлет развернут в 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 Ответ

4 голосов
/ 19 февраля 2012

Вы определенно должны не полагаться на возможность изменять файл, содержащийся в развернутом веб-приложении. В этот момент управление было передано контейнеру, и файл может быть перезаписан или даже недоступен для записи. Это также обременяет развертывание приложения, поскольку теперь они не могут просто сдуть развернутую папку WAR (если она существует) и повторно развернуть архив.

В качестве альтернативы вашему подходу рассмотрите возможность размещения файла свойств в расположении, внешнем по отношению к веб-приложению. Один из подходов, который я видел, успешно использовался:

  1. Определите «общеизвестное» местоположение, в котором файлы свойств времени выполнения будут быть размещенным или позволить развертывателю указать это местоположение через скважину известная собственность.
  2. Попытайтесь прочитать файл вашего имущества из этого места. Если это так не существует, создайте и инициализируйте его из шаблона, хранящегося в ваше заявление.
  3. Сохраните все изменения, сделанные во время выполнения приложений, на этом файл внешних свойств.

При такой настройке вам никогда не придется беспокоиться о невозможности записи файла или его перезаписи контейнером.

...