我有一个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>
答案 0 :(得分:76)
添加到您的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>
答案 1 :(得分:5)
您只需使用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}等文件的文件中。
答案 2 :(得分:4)
您可以使用Replace Ant Task来执行此操作。
下面是一个示例实现,其中我替换属性文件中的tokenkeys,使其适应您的需要
<强> 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
答案 3 :(得分:3)
我认为您可以使用maven-war-plugin的filteringDeploymentDescriptors选项来过滤部署描述符 -
<properties>
<maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors>
</properties>
答案 4 :(得分:1)
web.xml中的编码maven参数无法直接工作,因为在运行时,当应用程序启动时,maven已完成其工作,应用程序不了解maven。
您可以过滤替代web.xml(请参阅maven过滤:http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html)并在构建战争时使用它(请参阅war插件文档中的webXml参数:http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html)
答案 5 :(得分:0)
添加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>