如何用 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 中定义一个属性(例如“Moin”),如果您的 web.xml 中有一个占位符(“$ myProp") 这将替换为您的财产的价值(在我的示例中使用“Moin”) 这个实际上是用 pom 属性中的实际值替换占位符,但是在部署它之后给出错误提示 -- java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.to.active ' 在字符串值“$spring.profiles.to.active”中。而在 .war 和目标文件夹内,它的新值。知道为什么会这样吗? @JohnMaclein 我遇到了同样的问题。似乎所有找到的文件都被复制到“warSourceDirectory”。这意味着 web.xml 将被放置到根文件夹中。但是: 标记正在从未替换属性的原始 WEB-INF 文件夹中读取。试试“src/main/webapp/web.xml【参考方案2】:

你可以简单地使用 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 标签中定义的值替换 XML 文件中的字符串,还是我需要使用属性文件?【参考方案3】:

你可以使用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并设置&lt;filteringDeploymentDescriptors&gt;true&lt;/filteringDeploymentDescriptors&gt;以替换运行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 中的值?的主要内容,如果未能解决你的问题,请参考以下文章

在myeclipse里面如何用文本编辑器打开xml文件?

如何用前缀替换 xmlns 命名空间属性?

Maven 中的“需要 webxml 属性”错误

如何用 jQuery “替换” css 属性

如何用springboot写helloworld

如何用单选按钮替换 Groupbox Text 属性?