У меня есть веб-приложение, которое требует двух настроек:
- Источник данных JDBC
- Строковый токен
Я отчаянно хочу иметь возможность развернуть один .war в различных контейнерах (jetty, tomcat, gf3 минимум) и настроить эти параметры на уровне приложения внутри контейнера.
Мой код делает это:
InitialContext ctx = new InitialContext();
Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
token = (String)envCtx.lookup("token");
ds = (DataSource)envCtx.lookup("jdbc/datasource")
Давайте предположим, что я использовал интерфейс управления glassfish для создания двух ресурсов jdbc: jdbc / test-datasource и jdbc / live-datasource, которые подключаются к разным копиям одной и той же схемы, на разных серверах, с разными учетными данными и т. Д. Скажем, я Я хочу развернуть это на glassfish и указать на источник тестовых данных, это может быть в моем файле sun-web.xml:
...
<resource-ref>
<res-ref-name>jdbc/datasource</res-ref-name>
<jndi-name>jdbc/test-datasource</jndi-name>
</resource-ref>
...
но
- sun-web.xml идет внутри моя война, верно?
- наверняка должен быть способ сделать это через интерфейс управления
Я даже пытаюсь поступить правильно? Другие контейнеры делают это легче? Мне было бы особенно интересно узнать, как Jetty 7 справляется с этим, поскольку я использую его для разработки.
РЕДАКТИРОВАТЬ У Tomcat есть разумный способ сделать это:
Создать $TOMCAT_HOME/conf/Catalina/localhost/webapp.xml
с:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true">
<!-- String resource -->
<Environment name="token" value="value of token" type="java.lang.String" override="false" />
<!-- Linking to a global resource -->
<ResourceLink name="jdbc/datasource1" global="jdbc/test" type="javax.sql.DataSource" />
<!-- Derby -->
<Resource name="jdbc/datasource2"
type="javax.sql.DataSource"
auth="Container"
driverClassName="org.apache.derby.jdbc.EmbeddedDataSource"
url="jdbc:derby:test;create=true"
/>
<!-- H2 -->
<Resource name="jdbc/datasource3"
type="javax.sql.DataSource"
auth="Container"
driverClassName="org.h2.jdbcx.JdbcDataSource"
url="jdbc:h2:~/test"
username="sa"
password=""
/>
</Context>
Обратите внимание, что override="false"
означает обратное. Это означает, что этот параметр нельзя переопределить на web.xml
.
Мне нравится этот подход, потому что файл является частью конфигурации контейнера , а не войной, но он не является частью глобальной конфигурации; это зависит от веб-приложения.
Полагаю, я ожидаю немного большего от glassfish, поскольку предполагается, что он имеет полноценный веб-интерфейс администратора, но я был бы достаточно доволен чем-то эквивалентным вышеописанному.