У меня есть веб-приложение проект Знатока, и я хочу настроить файл web.xml в зависимости от Профиля, который работает. Я использую Военный плагин Знатока, который позволяет мне определять каталог "ресурсов", где файлы могут быть фильтрованы. Однако одна только фильтрация не достаточна для меня.
Более подробно я хочу включать (или исключить) целый раздел по безопасности, в зависимости от профиля I выполнение. Это - часть:
....
....
<security-constraint>
<web-resource-collection>
<web-resource-name>protected</web-resource-name>
<url-pattern>/pages/*.xhtml</url-pattern>
<url-pattern>/pages/*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>${web.modules.auth.type}</auth-method>
<realm-name>MyRealm</realm-name>
</login-config>
<security-constraint>
....
....
Если это не сделано легко, есть ли способ иметь два файла web.xml и выбрать соответствующий в зависимости от профиля?
есть ли способ создать два файла web.xml и выбрать подходящий в зависимости от профиля?
Да, в каждый профиль вы можете добавить конфигурацию maven -war-plugin
и настроить каждый так, чтобы он указывал на другой web.xml
.
<profiles>
<profile>
<id>profile1</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>/path/to/webXml1</webXml>
</configuration>
</plugin>
...
В качестве альтернативы необходимости указывать конфигурацию maven-war-plugin
в каждом профиле, вы можете указать конфигурацию по умолчанию в основном разделе POM, а затем просто переопределить ее для определенных профилей.
Или, чтобы быть проще, в главном
вашего POM используйте свойство для ссылки на атрибут webXml
, а затем просто измените его значение в разные профили
<properties>
<webXmlPath>path/to/default/webXml</webXmlPath>
</properties>
<profiles>
<profile>
<id>profile1</id>
<properties>
<webXmlPath>path/to/custom/webXml</webXmlPath>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>${webXmlPath}</webXml>
</configuration>
</plugin>
...
"matt b" уже опубликовал ответ, который представляет собой наиболее изобретательный способ сделать это. Я бы рекомендовал это делать в 99% случаев.
Однако иногда ваш файл конфигурации может быть довольно сложным, и не имеет особого смысла дублировать весь файл для каждой среды, если отличается только один раздел XML. В этих случаях вы можете злоупотребить фильтрацией свойств для достижения своей цели.
Внимание! За этим следует очень липкое решение, которое не подойдет для слабонервных:
В вашем pom.xml:
Экранирование html-сущности - это часть решения. Решение будет НЕ работает, если вы замените все это знаками «больше» и «меньше». Пожалуйста, оставьте ответ как есть ...
<properties>
<test.security.config>
<security-constraint>
<web-resource-collection>
<web-resource-name>protected</web-resource-name>
<url-pattern>/pages/*.xhtml</url-pattern>
<url-pattern>/pages/*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>${web.modules.auth.type}</auth-method>
<realm-name>MyRealm</realm-name>
</login-config>
<security-constraint>
</test.security.config>
</properties>
в вашем web.xml
....
${test.security.config}
....
Поскольку несуществующие свойства оцениваются как пустая строка, ваши конфигурации, для которых это свойство не установлено (или свойство является пустым тегом xml) здесь будет пустая строка.
Это некрасиво, и xml трудно изменить в такой форме. Однако, если ваш web.xml сложный и вы представляете больший риск рассинхронизации 4-5 копий web.xml, это может быть подход, который вам подойдет.