Различные ресурсы из context.xml для профилей maven - PullRequest
0 голосов
/ 06 июня 2018

У меня есть приложение, работающее на tomcat 8, которое работает нормально.Теперь я хочу создать приложение для среды разработки, тестирования и производства, где приложение подключается к разным серверам баз данных, и я хотел бы выбрать, какой ресурс использовать для свойства maven, заданного в разных профилях.

Итак, в моем context.xml я определил источники данных, которые выглядят так для каждого сервера БД.

<Resource name="jdbc/db-dev" auth="Container"
    type="javax.sql.DataSource" maxTotal="1000" maxIdle="30"
    maxWaitMillis="10000" username="user" password="password"
    driverClassName="org.mariadb.jdbc.Driver"
    url="jdbc:mariadb://x.x.x.x:3306/dbname;" />

<Resource name="jdbc/db-test" auth="Container"
    type="javax.sql.DataSource" maxTotal="1000" maxIdle="30"
    maxWaitMillis="10000" username="user" password="password"
    driverClassName="org.mariadb.jdbc.Driver"
    url="jdbc:mariadb://x.x.x.x:3306/dbname;" />

И в моем файле web.xml

<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>${db.context}</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

И в моем pom.xml

<profile>
    <id>dev</id>
    <properties>
        <db.context>jdbc/db-dev</db.context>
    </properties>
</profile>

И в Java

try {
    Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup(ENV);
    DataSource ds = (DataSource) envContext.lookup("jdbc/db"); // jdbc/db-??? is the issue
    return ds.getConnection();
} catch (NamingException e) {
    throw new SQLException(e);
}

И есть проблема, в Java у меня есть фиксированное строковое значение, указывающее только на один ресурс.Я знаю, что я мог бы создать файл свойств во время сборки, но только для одного этого значения это кажется слишком многим.Есть ли способ, чтобы ссылка на ресурс ссылалась на другие ресурсы из контекста xml, имея только одно ссылочное имя?

Другой метод, который я нашел, - это иметь разные файлы ресурсов, которые я могу включать и исключать, вероятно, для каждого профиля.Я еще не слишком увлекся этим, но, может быть, есть гораздо более простое решение, которого я сейчас не вижу.

1 Ответ

0 голосов
/ 06 июня 2018

Я бы предпочел иметь одинаковые двоичные файлы (например, WAR в данном случае) для каждой среды, чтобы следовать принципу CI / CD "Построить, развернуть часто".Конфигурации, зависящие от среды, будут затем вводиться в некоторых отношениях, например, через переменные среды, параметры JVM при запуске приложения или внешний файл конфигурации и т. Д.

С это ,Tomcat поддерживает использование ${xxxx} для подстановки переменных в своем файле конфигурации:

Файлы конфигурации Tomcat отформатированы как XML без схемы;элементы и атрибуты чувствительны к регистру.Поддерживается подстановка переменных в стиле Apache Ant;системное свойство с именем propname может использоваться в файле конфигурации с использованием синтаксиса $ {propname}.Доступны все системные свойства, включая те, которые установлены с использованием синтаксиса -D, автоматически доступные для JVM и настроенные в файле $ CATALINA_BASE / conf / catalina.properties.

Итак, context.xmlбудет выглядеть примерно так:

<Resource name="jdbc/db" auth="Container"
    type="javax.sql.DataSource" maxTotal="1000" maxIdle="30"
    maxWaitMillis="10000" username="${DB_USER}" password="${DB_PASSWORD}"
    driverClassName="org.mariadb.jdbc.Driver"
    url="jdbc:mariadb://${DB_HOST}/dbname;" />

Затем настройте ${DB_USER}, ${DB_PASSWORD} и ${DB_HOST} в качестве переменных среды или параметров JVM при запуске tomcat и т. д. *

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