System.getProperty ("catalina.base") Может быть сценарий, когда клиент может использовать любой другой сервер - PullRequest
14 голосов
/ 24 мая 2011

Я читаю файл свойств из каталога 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 ]

17 голосов
/ 24 мая 2011

Есть два основных способа.

  1. Просто добавьте его путь к пути к классам времени выполнения, чтобы вы могли получить его из пути к классам обычным способом.В случае Tomcat вы можете добавить внешние папки в путь к классам среды выполнения, указав его в свойстве shared.loader /conf/catalina.properties.Например,

    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);
    // ...
    

В любом случае, при распространении приложения вы должны должным образом документировать его , чтобы serveradmin мог настроить его соответствующим образом.


Не связано спроблема, ResourceBundle это не правильный способ чтения файлов свойств конфигурации.Он предназначен для локализованного контента для интернационализации.

1 голос
/ 24 мая 2011

Сначала используйте ServletContext.getServerInfo () , чтобы определить контейнер.Затем, основываясь на контейнере, используйте контейнеры для получения информации.Например, если метод возвращает «tomcat *», то вы можете использовать catalina.base, если он возвращает glassfish, затем использовать некоторые специальные способы glassfish и т. Д.

0 голосов
/ 24 мая 2011

Проще говоря, не полагайтесь на catalina.base, это ваша первая проблема:)

Или, точнее, Java-сервлет API предоставляет вам доступ к ресурсам внутри вашего веб-приложения, поэтому ваше приложение действительно переносимо (не только между серверами, но и вы можете поместить его в любое место в файловой системе, заархивировав его как войну). или взорвался)

Скажем, вы поместили свой файл в <webapp-root>/WEB-INF/somename.properties, тогда это то, что вы делаете в своем сервлете, слушателе или других веб-классах:

getServletContext().getResourceAsStream("/WEB-INF/somename.properties");

См. Аналогичный вопрос здесь .

Другой альтернативой является использование обычного Java API для поиска файлов в вашем classpath, например this.getClass().getResource("/somename.properties"). В случае веб-приложения этот файл будет найден под /WEB-INF/class/ или в любом банке под /WEB-INF/lib/.

Наконец, если вы не можете поместить файл в ваше веб-приложение, вы можете поместить его в любое место на жестком диске и использовать некоторый параметр конфигурации (например, системное свойство или параметр контекста в web.xml) для ссылки на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...