如何用 Maven 属性替换 web.xml 中的值?
Posted
技术标签:
【中文标题】如何用 Maven 属性替换 web.xml 中的值?【英文标题】:How to replace a value in web.xml with a Maven property? 【发布时间】:2013-02-27 15:21:59 【问题描述】:我有一个 Maven 项目,它将一些测试文件下载到其构建目录./target/files
。然后这些文件应该可供 servlet 使用,我可以通过将完整路径硬编码为 servlet 的 <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: Customize web.xml of web-app project
【讨论】:
更多信息请参见maven.apache.org/plugins/maven-war-plugin/examples/… 解决方案中有什么可以进行替换的? @alikelzin-kilaka:您可以在 pom.xml 中定义一个属性(例如“你可以简单地使用 maven filtering resources:
<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 等内容的文件中。
【讨论】:
这段代码会过滤并用 pom.xml你可以使用Replace Ant Task来做。
这是一个示例实现,我在其中替换属性文件中的令牌键,使其适应您的需求
test.properties
SERVER_NAME=@SERVER_NAME@
PROFILE_NAME=@PROFILE_NAME@
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="@SERVER_NAME@" value="My Server"/>
<replacefilter token="@PROFILE_NAME@" value="My Profile"/>
</replace>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
瞧! 现在执行
mvn clean package
【讨论】:
最好使用resources filtering 而不是Ant。 虽然接受的答案对于提出的实际问题更好,但这实际上正是我正在寻找的,因此我可以替换静态 html 文件中 webjar 依赖项的版本。谢谢!【参考方案4】:我认为您可以使用 maven-war-plugin 的 filteringDeploymentDescriptors 选项来过滤部署描述符 -
<properties>
<maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors>
</properties>
【讨论】:
【参考方案5】:添加maven-war-plugin
并设置<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
以替换运行mvn package
时的占位符
<properties>
<project.build.directory>your path</project.build.directory>
</properties>
<build>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
</configuration>
</plugin>
</build>
【讨论】:
【参考方案6】:在web.xml中编码maven参数不能直接工作,因为在运行时,当你的应用程序启动时,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)
【讨论】:
以上是关于如何用 Maven 属性替换 web.xml 中的值?的主要内容,如果未能解决你的问题,请参考以下文章