Чтение свойств от tomcat
Какова наилучшая практика для чтения конфигурационных файлов для вашего приложения. Какие папки в tomcat-сервере "находятся на пути к классам".
Я попытался разместить мой файл конфигурации в TOMCAT_HOME\conf
, но все же я не могу его прочитать из своего сервлета.
Пробовал использовать это (есть файл app.properties в conf):
this.getClass().getClassLoader().getResourceAsStream("/app.properties");
У меня не так много свойств, возможно, 10-15. Я полагал, что это не проблема. Я помню, когда я использовал jboss, это не было проблемой, как это много.
В моем приложении я также указываю соединение с DB spring в context.xml
, могу ли я указать мои свойства там как-то? Или как это работает с tomcat?
Я хотел бы сохранить свои свойства отдельно от моей войны/распакованной войны.
Обновление
Причина для этого объясняется тем, что я не знаю, где будет развернуто мое приложение (в каком месте)
Ответы
Ответ 1
Существует много разных способов, но это зависит от ваших потребностей:
Чтобы загрузить файл свойств из каталога $TOMCAT_HOME/conf
, вам необходимо получить к нему доступ с помощью объекта java.io.File
, так как загрузчик классов (как в this.getClass().getClassLoader().getResourceAsStream(...)
может просто загружать файлы (и классы) из вашего пути к классу ( под WEB-INF/classes
, WEB-INF/lib
или $TOMCAT_HOME/lib
).
Самый простой пример загрузки файла из каталога конфигурации Tomcat:
File configDir = new File(System.getProperty("catalina.base"), "conf");
File configFile = new File(configDir, "myconfig.properties");
InputStream stream = new FileInputStream(configFile);
Properties props = new Properties();
props.load(stream);
Обратите внимание, что этот подход сделает ваш код зависимым от Tomcat (механизм загрузки зависит от того, доступен ли системный объект Tomcat). Это то, что я бы не рекомендовал вообще, поэтому, если вы переместите свой файл свойств в папку внутри вашего пути к классам, тогда вы сможете загрузить его так, как вы пытались и ваше приложение может быть развернуто в любом контейнере.
И вы можете настроить свои свойства как ресурсы JNDI, но для их доступа было бы слишком много хлопот.
Ответ 2
Поместите свои файлы в свой webapp WEB-INF/classes
. Это каталог классов по умолчанию. conf
, если только для внутренних компонентов Tomcat.
Ответ 3
Вместо того, чтобы ссылаться на местоположение конкретного файла конфигурации, я бы использовал конфигурацию, связанную с JNDI, чтобы поддерживать приложения в зависимости от данных конфигурации и стандартов Java EE. Я вижу два варианта:
-
Если у вас есть только небольшое количество записей конфигурации в вашем файле свойств, подумайте о том, чтобы сделать Записи среды и получить к ним доступ через JNDI в ваших приложениях.
-
В качестве альтернативы скажите, что если вы хотите сохранить свои свойства в отдельном файле свойств, вы также можете создать bean для представления свойств, factory (инициализация bean с использованием файла свойств ) и подключите его к JNDI как Определение ресурсов.
Благодаря этому можно даже регулярно перечитывать файл свойств без необходимости перезапуска приложений, переключения между различными источниками конфигурации или аналогичными другими требованиями.
Каждое из веб-приложений, использующих эту конфигурацию, должно будет включить ссылку на ресурсы в ней web.xml
для ссылки на конфигурацию bean ( или ссылку на каждую запись env., если используется вариант 1).
Ответ 4
Насколько я знаю, вы можете настроить datasource
в tomcat. DataSource в Tomcat
После этого вы можете использовать datasource
в своем приложении.
Ответ 5
Хотя это может быть PITA, возможно, это также функция, которая не знает, где она будет развернута. Вы не можете "параться" с этим фактом!
В зависимости от остальной части вашего Java-пакета лучший способ обычно не зависит от Tomcat. Если вы используете Spring, вы можете сказать, например:
new ClassPathResource("**/myFile.properties")
или при использовании Java Config, еще один пример:
@PropertySource("classpath:META-INF/MyWeb.properties")
В простой Java вы можете сказать:
InputStream stream = loader.getResourceAsStream(resourceName);
где loader - это экземпляр класса ClassLoader
Ответ 6
добавить файл .properties в папку apache-tomcat-7.0.78\conf:
File configDir = new File(System.getProperty("catalina.base"), "conf");
File configFile = new File(configDir, "dashboardiframes.properties");
InputStream stream = new FileInputStream(configFile);Properties properties = new Properties();
properties.load(stream);