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}等属性。 字符串替换可能是唯一的选择。
选项
-
在创建WAR之前,在复制到target / project-1.0-SNAPSHOT目录之后修改文本文件。
-
打包后,从WAR中提取文本文件,修改它们,然后将它们添加回WAR。
我想在这里有另一种选择,我很想念。 想什么?
选项1是不可行的, prepare-package
太早, package
太晚了所以我看不到你可以插入任何自定义工作的地方。 选项2是可行的但是痛苦的IMO。 所以这里有一些更多的命题(所有命题都基于AntRun和ReplaceRegExp和/或Replace任务)。
解决方案1:
- 创建一个新文件夹,放置需要处理的文本文件。
- 将antrun插件绑定到
prepare-package
并将其配置为处理文件并将处理后的文件放在target
下的某个目录中(例如target/textfilesdir
)。 - 配置war插件以包含
target/textfilesdir
作为webResource
。 有关详细信息,请参阅添加和筛选外部Web资源 。
解决方案2:
- 将antrun插件绑定到
prepare-package
并将其配置为处理来自src/main/webapp/textfilesdir
,并将处理后的文件放在target/project-1.0-SNAPSHOT
。 - 配置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更新的版本。