Мне нужны некоторые идеи о том, как упростить конфигурацию веб-приложений с Tomcat 7.Упрощая конфигурации web.xml в Tomcat 7
У меня есть веб-приложение, которое использует два ресурсы, определенные в файле конфигурации context.xml Tomcat в: а Mail Session и JDBC Datasource.
<Resource name="mail/MailService" ...
<Resource name="jdbc/JDBCDatasource" ...
Для того, чтобы использовать их в веб-приложение, которое я должен объявить две ссылки в дескрипторе развертывания web.xml, указав то же имя:
<resource-ref>
<res-ref-name>mail/MailService</res-ref-name>
...
<resource-ref>
<res-ref-name>jdbc/JDBCDatasource</res-ref-name>
....
Затем в коде приложения, я есть для поиска ресурсов, опять-таки с их именами:
Context ctx = new InitialContext();
Session sn = (Session) ctx.lookup("java:comp/env/mail/MailService");
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/JDBCDatasource");
дело в том, что название ресурсов может быть изменен сисадминов; поэтому я не могу жестко указать имя ресурсов. Я мог бы использовать context-param или что-то подобное, чтобы позволить системным администраторам указать выбранное имя для каждого ресурса, но, учитывая, что я должен использовать часть ref-ref, я бы не хотел указывать одно и то же имя дважды в файле web.xml (один для параметра и другой для ссылки). Дублирование конфигурации напоминает дублирование шансов, которые кто-то допустил ошибку, и я хочу свести к минимуму вероятность неудачных конфигураций.
Я искал в Интернете такие вещи, как переменные в web.xml, но я ничего не нашел .. у кого-то есть идеи об этом?
=== Решение ===
После линий указывал Brett, это то, что я сделал, чтобы избежать дублирования конфигурации:
Во-первых, съехал конфигурацию ресурсов из контекста Tomcat. XML в server.xml Tomcat, в пределах области GlobalNamingResources, с использованием общих имен:
<GlobalNamingResources>
...
<Resource name="mail/MailService1" ...
<Resource name="jdbc/JDBCDatasource1" ...
...
Затем я создал два ResourceLink в файле приложения context.xml (обратите внимание не Tomcat один) , Где каждый из ссылок имеет точное название, используемое приложение, и точка, через глобальный атрибут, к ресурсу:
<ResourceLink name="jdbc/MyAppJDBCService" global="jdbc/JDBCDatasource1" type="javax.sql.DataSource"/>
<ResourceLink name="mail/MyAppMailService" global="mail/MailService1" type="javax.mail.Session"
/>
При том, что ссылки на ресурсы в web.xml в приложения больше не нужны.
Наконец, в исходном коде приложения я изменил поисковую часть, чтобы использовать имена, указанные в context.xml (а не те, которые используются в server.xml):
Context ctx = new InitialContext();
Session sn = (Session) ctx.lookup("java:comp/env/mail/MyAppMailService");
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyAppJDBCService");
С помощью этой установки, администратор отвечает за настройку ресурсов в файле server.xml Tomcat, используя имена, которые он хочет, и разработчику просто нужно сопоставить эти имена с теми, которые используются приложением, просто изменяя контекст приложения context.xml.
Это довольно просто сейчас, но раньше я делал это плохо.
Хорошо, я так понимаю. Я попробовал второй вариант. Я сделал следующее: во-первых, я поместил конфигурацию ресурсов в раздел GlobalNamingResources файла server.xml с некоторым «общим» файлом имен и удалил его из контекста Tomcat; то в app.context.xml приложения (в META-INF) я создал два ResourceLink, по одному для каждого ресурса, указав на них, с атрибутом имени, содержащим точное имя, используемое приложением для их захвата, и с глобальным именем содержащий имя ресурса, объявленное в server.xml. Спасибо. –