Как заменить значение в web.xml свойством Maven?
У меня есть проект Maven, который загружает некоторые тестовые файлы в его каталог сборки ./target/files
. Эти файлы затем должны быть доступны сервлету, который я могу легко достичь путем жесткого кодирования полного пути как <init-param>
сервлета:
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>my.package.TestServlet</servlet-class>
<init-param>
<param-name>filepath</param-name>
<param-value>/home/user/testproject/target/files</param-value>
</init-param>
</servlet>
Как я могу избежать жесткого кодирования полного пути и вместо этого использовать замену динамических параметров? Я попробовал следующее, но это не сработало:
<param-value>${project.build.directory}/files</param-value>
Ответы
Ответ 1
Добавить в раздел pom:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<filtering>true</filtering>
<directory>src/main/webapp</directory>
<includes>
<include>**/web.xml</include>
</includes>
</resource>
</webResources>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
</configuration>
</plugin>
Смотрите Maven: настройте web.xml проекта веб-приложения для более подробной информации
Ответ 2
Вы можете использовать Заменить Ant Задача, чтобы сделать это.
Вот пример реализации, в котором я заменяю tokenkeys в файле свойств, адаптирую его в соответствии с вашими потребностями.
test.properties
[email protected][email protected]
[email protected][email protected]
pom.xml
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>compile</phase>
<configuration>
<tasks>
<replace dir="${basedir}/src/main/resources" >
<include name="**/*.properties"/>
<replacefilter token="@[email protected]" value="My Server"/>
<replacefilter token="@[email protected]" value="My Profile"/>
</replace>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
вуаля!
Теперь выполните
mvn clean package
Ответ 3
Вы можете просто использовать maven фильтровать ресурсы:
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
</resources>
...
</build>
...
</project>
Вы также можете объединить это и хотите фильтровать некоторые файлы, тогда как другие не должны быть отфильтрованы:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.xml</exclude>
</excludes>
</resource>
...
</resources>
Поместите соответствующие заполнители в файлы, которые вы хотели бы заменить, например, ${home}.
Ответ 4
Я думаю, вы можете использовать параметр maven-war-plugin filteringDeploymentDescriptors для фильтрации дескрипторов развертывания -
<properties>
<maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors>
</properties>
Ответ 5
Параметры кодирования maven в web.xml не могут работать напрямую, потому что во время выполнения, когда ваше приложение запускается, maven завершил свою работу, и приложение не знает о maven.
Вы можете отфильтровать альтернативный web.xml(см. фильтрацию maven: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html) и использовать его при построении войны (см. webXml параметр в документации к плагину войны: http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html)