我有一个带有文本文件的 Maven Web 应用程序
src/main/webapp/textfilesdir
据我了解,在打包阶段,这个 textfilesdir 目录将被复制到
target/project-1.0-SNAPSHOT
目录,然后压缩成一个
target/project-1.0-SNAPSHOT.war
问题
现在,我需要对 target/project-1.0-SNAPSHOT/textfilesdir 中的文本文件的内容进行字符串替换。这必须在将 textfilesdir 复制到 target/project-1.0-SNAPSHOT 之后,但在创建 target/project-1.0-SNAPSHOT.war 文件之前完成。我相信这一切都是在打包阶段完成的。
插件(可能是 maven-antrun-plugin)如何插入包阶段来执行此操作。
文本文件不包含要过滤的属性,例如 ${property-name}。字符串替换可能是唯一的选择。
选项
在复制到 target/project-1.0-SNAPSHOT 目录之后,但在创建 WAR 之前修改文本文件。
打包后,将WAR中的文本文件解压,修改,再添加回WAR中。
我想我还缺少另一个选项。有人想过吗?
最佳答案
我遇到了同样的问题,而且我一直在摆弄这个问题,所以尽管这个问题已经很老了,但我还是会回答。正如 leandro 和 Phil 所说,可以使用 maven-replacer-plugin。但是他们的解决方案对我不起作用。启用 useCache
导致无法构建项目的错误。此外,我无法让自动清洁功能正常工作。
由于还不允许我对帖子发表评论,因此我将在此处提供完整的解决方案:
首先,配置maven-replacer-plugin:
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>maven-replacer-plugin</artifactId>
<version>1.3.7</version>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>replace</goal>
</goals>
</execution>
</executions>
<configuration>
<includes>
<include>target/${project.build.finalName}/static/**/*.css</include>
</includes>
<regex>false</regex>
<token>someString</token>
<value>replaceString</value>
</configuration>
</plugin>
在构建实际 war 之前,我们先创建一个爆炸 war 。这意味着,war 文件的全部内容都存储在子目录中(默认情况下为 target/${project.build.finalName})。之后,maven-replacer-plugin 将按照我们指定的方式更改文件的内容。最后,.war 将由 default-war
作业在 package 阶段打包。为避免覆盖 exploded war 文件夹的内容,必须将 warSourceDirectory
设置为存储 exploded war 内容的目录。以下配置片段将完成这项工作:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>prepare</id>
<phase>prepare-package</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
<execution>
<id>default-war</id>
<phase>package</phase>
<goals>
<goal>war</goal>
</goals>
<configuration>
<warSourceDirectory>${project.build.directory}/${project.build.finalName}</warSourceDirectory>
</configuration>
</execution>
</executions>
</plugin>
可以使用替换内容构建包
mvn clean package
关于java - 文本 Web 资源的 Maven 字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3018405/