Это действительно зависит от того, для чего вы используете эти свойства.
Некоторые (например, источник данных) можно настроить в самом контейнере ( Tomcat 5.5. Ресурсы JNDI , см. Также раздел Источники JDBC).
Другие (специфичные для приложения) действительно могут быть свойствами. В этом случае ваш выбор:
- Объединить свойства в файле WAR и загрузить соответствующее подмножество на основе какого-либо внешнего переключателя (либо переменной среды, либо свойства JVM)
- Настройте процесс развертывания на каждом из ваших серверов, где распаковывается war и файл свойств (расположенный в предопределенном месте на этом сервере и специфичный для этого сервера) копируется в
WEB-INF/classes
(или другое подходящее место).
Что касается "это желаемая цель" - да, я так думаю. Наличие единой WAR для тестирования в QA / staging и последующего развертывания в производство сокращает промежуточный этап и, таким образом, оставляет меньше шансов на ошибки.
Обновление (на основе комментария):
Элемент # 1 выше относится к фактической переменной среды (например, что-то, что вы установили через SET ENV_NAME=QA
в Windows или ENV_NAME=QA; export ENV_NAME
в Linux). Вы можете прочитать его значение из вашего кода, используя System.getenv()
и загрузить соответствующий файл свойств:
String targetEnvironment = System.getenv("TARGET_ENV");
String resourceFileName = "/WEB-INF/configuration-" + targetEnvironment + ".properties";
InputStream is = getServletContext().getResourceAsStream(resourceFileName);
Properties configuration = new Properties();
configuration.load(is);
Но да, вместо этого вы можете определить скалярное значение через JNDI ( см. Записи окружения в Tomcat doc ) вместо этого:
<Context ...>
<Environment name="TARGET_ENV" value="DEV" type="java.lang.String" override="false"/>
</Context>
и прочитайте его в своем приложении через
Context context = (Context) InitialContext().lookup("java:comp/env");
String targetEnvironment = (String) context.lookup("TARGET_ENV");
// the rest is the same as above
Дело в том, что если вы все равно будете использовать JNDI, вы также можете отказаться от своих файлов свойств и все настроить через JNDI. Ваши источники данных будут доступны вам как фактические ресурсы, а базовые свойства останутся скалярами (хотя они будут безопасны по типу).
В конечном итоге вам решать, какой путь лучше для ваших конкретных потребностей; у обоих есть свои плюсы и минусы.