System.getProperty( "catalina.base" ) Может существовать сценарий, в котором клиент может использовать любой другой сервер

Я читаю файл свойств из каталога 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, но для этого мне нужно сохранить файл свойств в моей сборке, чего я не хочу. Я просто хочу прочитать мой файл свойств из-за пределов моей сборки.

Ответы

Ответ 1

Существуют два способа.

  • Просто добавьте его путь к пути пути выполнения, чтобы вы могли получить его из класса path обычным способом. В случае 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);
    // ...
    

  • Добавьте другое независимое от сервера системное свойство самостоятельно, вы можете установить его как аргумент виртуальной машины.

    -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 не является правильным способом чтения файлов свойств конфигурации. Он предназначен для локализованного контента для интернационализации.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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