Maven字符串替换文本Web资源

我有一个带有文本文件的Maven Web应用程序

的src /主/ web应用/ textfilesdir

据我了解,在包阶段,这个textfilesdir目录将被复制到

目标/项目-1.0-快照

目录,然后压缩成一个

目标/项目-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}等属性。 字符串替换可能是唯一的选择。

选项

  1. 在创建WAR之前,在复制到target / project-1.0-SNAPSHOT目录之后修改文本文件。

  2. 打包后,从WAR中提取文本文件,修改它们,然后将它们添加回WAR。

我想在这里有另一种选择,我很想念。 想什么?

选项1是不可行的, prepare-package太早, package太晚了所以我看不到你可以插入任何自定义工作的地方。 选项2是可行的但是痛苦的IMO。 所以这里有一些更多的命题(所有命题都基于AntRun和ReplaceRegExp和/或Replace任务)。

解决方案1:

  1. 创建一个新文件夹,放置需要处理的文本文件。
  2. 将antrun插件绑定到prepare-package并将其配置为处理文件并将处理后的文件放在target下的某个目录中(例如target/textfilesdir )。
  3. 配置war插件以包含target/textfilesdir作为webResource 。 有关详细信息,请参阅添加和筛选外部Web资源 。

解决方案2:

  1. 将antrun插件绑定到prepare-package并将其配置为处理来自src/main/webapp/textfilesdir ,并将处理后的文件放在target/project-1.0-SNAPSHOT
  2. 配置war插件以排除以前处理的文件。 同样,请参阅添加和过滤外部Web资源以获取详细信息。

我想我会选择第二个解决方案。

我有同样的问题,而且我在这个问题上摆弄了很多,所以我会回答这个问题已经很久了。 正如leandro和Phil所说,可以使用maven-replacer-plugin。 但他们的解决方案对我不起作用。 启用useCache导致错误,导致无法构建项目。 另外,我不能使自动清洁的东西正常工作。 由于我不允许对post发表评论,我将在此提供完整的解决方案:

首先,配置maven-replacer-plugin:

  com.google.code.maven-replacer-plugin maven-replacer-plugin 1.3.7   prepare-package  replace      target/${project.build.finalName}/static/**/*.css  false someString replaceString   

在真正的战争建立之前,我们制造了一场爆炸性战争。 这意味着,war文件的整个内容存储在子目录中(默认情况下为target / $ {project.build.finalName})。 之后,maven-replacer-plugin将按照我们的指定更改文件的内容。 最后,.war将在default-war作业的包装阶段打包。 为了避免重写爆炸的war文件夹的内容,必须将warSourceDirectory设置为存储爆炸的war内容的目录。 以下配置代码段将执行此作业:

  maven-war-plugin 2.1.1   prepare prepare-package  exploded    default-war package  war   ${project.build.directory}/${project.build.finalName}     

具有替换内容的包可以使用mvn clean package构建

我有阶段的问题,使用prepare-package没有将文件复制到战争,我的解决方案是这样的:

在maven-war-plugin中添加此配置

  org.apache.maven.plugins maven-war-plugin 2.1.1   prepare-package  exploded       ${basedir}/WebContent?   /style.scss      Add the configuration to replacer  com.google.code.maven-replacer-plugin replacer 1.5.1   scss-replacement prepare-package  replace   WebContent?/css/style.scss   \$url:.  \$url: "www.myapplication.com.br/css/style.css"; target/app/css/style.scss     

输出文件没有覆盖文件,所以我把配置maven-war-plugin排除文件style.scss。 再见!

我的另一个解决方案,抱歉迟到了聚会,但仍然可能对某些人有用。 上面的解决方案对我来说根本不起作用,因为我有覆盖到位,因此在主要来源中使用替换插件很难。 因此,我使用maven-war-plugin在prepare-package阶段为我生成临时目录,并使用replacer插件来操作它并从该目录释放war,以便其他任何内容都不会覆盖它。

   maven-war-plugin   prepare prepare-package  exploded   ${project.build.directory}/${project.build.finalName}-patched/    default-war package  war   true ${project.build.directory}/${project.build.finalName}-patched/      com.google.code.maven-replacer-plugin replacer   prepare-package  replace     ${project.build.directory}/${project.build.finalName}-patched/fileToBeChanged.txt ValueToChange ValueToReplace   

你可以使用maven-replacer-plugin:

  com.google.code.maven-replacer-plugin maven-replacer-plugin 1.3.7   prepare-package  replace     target/${project.artifactId}-${project.version}/WEB-IN/site.xml   ear.version ${ear.version}-${maven.build.timestamp}     

但是你还需要两个技巧。 一个是将爆炸目标添加到war插件中:

  org.apache.maven.plugins maven-war-plugin 2.1.1 .....   prepare-package  exploded     

最后需要在包之前调用mvn clean。 你可以从你的pom做到:

   maven-clean-plugin 2.4.1   auto-clean initialize  clean     

如果您使用的是比2.0.1更新的maven-war-plugin版本,则需要在maven-war-plugin的配置中包含true,否则对文件的更改将在war插件会再次复制您的webapp。 如果您使用的是Hudson / Jenkins,则必须使用比2.0.1更新的版本。