Как я могу сохранить параметры конфигурации Java EE вне EAR или WAR?

StackOverflow https://stackoverflow.com/questions/965061

Вопрос

Я хочу сохранить конфигурацию для веб-проекта вне веб-проекта (файл ear / war).Приложение не должно знать, в каком контейнере оно запущено (WebSphere / JBoss и т.д.).

Каков наилучший способ справиться с этим?

Является ли JNDI чистым способом?Если JNDI может решить мои проблемы, как мне следует его настроить?(Пользовательские объекты?)

В моем случае существуют только простые пары Ключ => Значение (Строка, String) для конечных точек SOAP / WS.

Это было полезно?

Решение

Видишь это вопрос для чтения файла свойств вне файла WAR.

Видишь это вопрос для считывания значений переменных из JNDI.Я считаю, что это лучшее решение.Вы можете прочитать строковую переменную с помощью этого кода:

Context initialContext = new InitialContext();
String myvar = (String) initialContext.lookup("java:comp/env/myvar");

Приведенный выше код будет работать со всеми контейнерами.В Tomcat вы объявляете следующее в conf/server.xml:

<GlobalNamingResources ...>
  <Environment name="myvar" value="..."
         type="java.lang.String" override="false"/>
</GlobalNamingResources>

Все вышесказанное позволит создать глобальный ресурс.Также возможно определить ресурс в контексте приложения.В большинстве контейнеров ресурсы JNDI доступны через консоль управления MBeans.Некоторые из них предлагают графический интерфейс для их редактирования.Самое большее, что требуется для перезапуска приложения, когда вносятся изменения.

То, как определяются и редактируются ресурсы JNDI, зависит от конкретного контейнера.Применение соответствующих настроек входит в обязанности конфигуратора / администратора.

Таковы преимущества, предлагаемые JNDI:

  • Вы можете определить значения параметров по умолчанию в файле WAR / EAR.
  • Параметры легко настраиваются в контейнере.
  • Вам не нужно перезапускать контейнер при изменении значения параметра.

Другие советы

У нас было аналогичное требование к конфигурации при развертывании веб-приложения для разных разработчиков и на Amazon EC2:как мы отделяем конфигурацию от двоичного кода?По моему опыту, JNDI слишком сложен и слишком сильно различается между контейнерами для использования.Кроме того, ручное редактирование XML очень подвержено синтаксическим ошибкам, поэтому была отвергнута идея.Мы решили эту проблему с помощью дизайна, основанного на нескольких правилах:

1) следует использовать только простые записи name= value

2) новые конфигурации должны быть доступны для загрузки путем изменения только одного параметра

3) наш двоичный файл WAR должен быть перенастраиваемым без его переупаковки

4) конфиденциальные параметры (пароли) никогда не будут упакованы в двоичный файл

Использование файлов .properties для всей конфигурации и использование System.getProperty("domain"); чтобы загрузить соответствующие файлы свойств, мы смогли выполнить требования.Однако системное свойство не указывает на URL-адрес файла, вместо этого мы создали концепцию, которую мы называем "домен", чтобы указать используемую конфигурацию.Местоположение конфигурации всегда:
$HOME/appName/config/$DOMAIN.properties.

Поэтому, если я хочу запустить свое приложение, используя свою собственную конфигурацию, я запускаю приложение, устанавливая домен на свое имя:
-Ddomain=jason
при запуске, и приложение загружает файл:
/home/jason/appName/config/jason.properties
Это позволяет разработчикам обмениваться конфигурациями, чтобы мы могли воссоздать то же состояние приложения для тестирования и развертывания без перекомпиляции или переупаковки.Значение домена затем используется для загрузки .properties из стандартного расположения, за пределами связанного WAR.

Я могу полностью воссоздать производственную среду на своей рабочей станции, используя производственную конфигурацию, такую:
-Ddomain=ec2 который загрузил бы:
/home/jason/appName/config/ec2.properties

Эта настройка позволяет нам выполнять циклы разработки / контроля качества / выпуска ровно с одним набором скомпилированных двоичных файлов, используя разные конфигурации в каждой среде.Нет риска того, что пароли / etc будут включены в двоичные файлы, и люди могут делиться своими конфигурациями, чтобы воссоздать проблемы, которые мы наблюдаем.

Я использую переменную окружения, чтобы указывать на URL-адрес (который, вероятно, является файлом:// URL), в котором содержится моя конфигурация.Это очень просто в настройке и не требует инфраструктуры JNDI.

Вот несколько примеров кода (набранного по памяти - я не компилировал / не тестировал это):

public void loadConfiguration() {
   String configUrlStr = System.getenv("CONFIG_URL"); // You'd want to use a more
                                                      // Specific variable name.
   if(configUrlStr == null || configUrlStr.equals("") {
       // You would probably want better exception handling, too.
       throw new RuntimeException("CONFIG_URL is not set in the environment."); 
   }


   try {
       URI uri = new URI(configUrlStr);
       File configFile = new File(uri);
       if(!configFile.exists()) {
          throw new RuntimeException("CONFIG_URL points to non-existant file");
       }
       if(!configFile.canRead()) {
          throw new RuntimeException("CONFIG_URL points to a file that cannot be read.");
       }
       this.readConfiguration(configFile);
   } catch (URISyntaxException e) {
       throw new RuntimeException("Malformed URL/URI in CONFIG_URL");
   }



}

вы можете просто сохранить тогда обычный файл свойств java, который находится в пути к классу, и просто загрузить свойства?

это прямолинейно и довольно просто..если только я чего-то не упускаю

Мои любимые места - это :Переменные среды и файлы свойств (как было предложено Джаредом и кгианнакакисом выше).

Таблица базы данных, хранящая свойства среды

Однако еще одним более простым решением является наличие таблицы базы данных, хранящей свойства среды.

Если ваше приложение использует базу данных

  • это относительно легко настроить
  • Дает действительно простой способ контролировать / изменять значения
  • Его можно хорошо интегрировать в процесс, сделав его частью скриптов БД
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top