Java 文本Web资源的Maven字符串替换
我有一个Maven web应用程序,其中包含文本文件 src/main/webapp/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插件)如何插入到包阶段来实现这一点 文本文件不包含要筛选的属性,例如${property name}。字符串替换可能是唯一的选择 选项Java 文本Web资源的Maven字符串替换,java,maven-2,package,war,phase,Java,Maven 2,Package,War,Phase,我有一个Maven web应用程序,其中包含文本文件 src/main/webapp/textfilesdir 据我所知,在打包阶段,这个textfilesdir目录将被复制到 目标/项目-1.0-快照 目录,然后将其压缩为 目标/项目-1.0-SNAPSHOT.war 问题 现在,我需要对target/project-1.0-SNAPSHOT/textfilesdir中文本文件的内容进行字符串替换。然后,必须在将textfilesdir复制到target/project-1.0-SNAPSHO
我在想,我还缺少另一个选择。有人认为吗?选项1不可行,
准备软件包
太早,软件包
太迟了,所以我不知道在哪里可以插入任何自定义工作。选项2是可行的,但在IMO中是痛苦的。因此,这里还有一些建议(都基于AntRun和and/or任务)
解决方案1:
prepare package
,并将其配置为处理文件,并将处理后的文件放在target
下的某个目录中(例如target/textfilesdir
)target/textfilesdir
作为webResource
。有关详细信息,请参阅prepare package
,并将其配置为处理src/main/webapp/textfilesdir
中的文本文件,并将处理后的文件放入target/project-1.0-SNAPSHOT
我想我会选择第二种解决方案。您可以使用maven replacer插件:
<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>
<file>target/${project.artifactId}-${project.version}/WEB-IN/site.xml</file>
<replacements>
<replacement>
<token>ear.version</token>
<value>${ear.version}-${maven.build.timestamp}</value>
</replacement>
</replacements>
</configuration>
</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>
com.google.code.maven-replacer-plugin
maven替换插件
1.3.7
准备包装
代替
target/${project.artifactId}-${project.version}/WEB-IN/site.xml
ear.version
${ear.version}-${maven.build.timestamp}
但你还需要两个技巧。一个是将爆炸目标添加到war插件中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
.....
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven战争插件
2.1.1
.....
准备包装
爆炸了的
最后需要在包之前调用mvn clean。您可以从pom中执行此操作:
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<id>auto-clean</id>
<phase>initialize</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
maven清洁插件
2.4.1
自动清洗
初始化
清洁的
如果您使用的maven war插件版本高于2.0.1,则需要在maven war插件的配置中包含true,否则,当war插件再次复制您的Web应用程序时,对您的文件所做的更改将被破坏。如果您使用的是Hudson/Jenkins,您将不得不使用比2.0.1更新的版本。我也遇到了同样的问题,我在这个问题上做了很多修改,所以我将回答这个问题,尽管这个问题很老。正如leandro和Phil所说,可以使用maven replacer插件。但他们的解决方案对我不起作用。启用
useCache
会导致错误,导致无法生成项目。此外,我无法使自动清洁装置正常工作。
由于我还不允许对这篇文章发表评论,我将在这里提供我的完整解决方案:
首先,配置maven replacer插件:
<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>
<file>target/${project.artifactId}-${project.version}/WEB-IN/site.xml</file>
<replacements>
<replacement>
<token>ear.version</token>
<value>${ear.version}-${maven.build.timestamp}</value>
</replacement>
</replacements>
</configuration>
</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>
包含替换内容的包可以使用
mvn clean package
我的阶段有问题,使用prepare package未将文件复制到war,我的解决方案是:
在maven war插件中添加此配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
<executions>
<configuration>
<webResources>
<resource>
<directory>${basedir}/WebContent?</directory> <excludes>
<!--Exclude the file because it is copied using the maven replacer plugin -->
<exclude>/style.scss</exclude>
</excludes>
</resource>
</webResources>
</configuration>
</plugin>
Add the configuration to replacer
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.1</version>
<executions>
<execution>
<id>scss-replacement</id> <phase>prepare-package</phase> <goals>
<goal>replace</goal>
</goals> <configuration>
<file>WebContent?/css/style.scss</file>
<!-- My local file(WebContent?/css/style.scss) have a param
$url: "http://localhost:8080/interface";
--> <!-- regex with match to $url: "http://localhost:8080/interface"; -->
<token>\$url:.</token>
<!-- Replace to -->
<value>\$url: "www.myapplication.com.br/css/style.css";</value>
<outputFile>target/app/css/style.scss</outputFile>
</configuration>
</execution>
<executions>
<plugin>
org.apache.maven.plugins
maven战争插件
2.1.1
准备包装
爆炸了的
${basedir}/WebContent?
/style.scss
将配置添加到replacer
com.google.code.maven-replacer-plugin
替代者
1.5.1
scss更换准备包
代替
WebContent?/css/style.scss
\$url:。
\$url:“www.myapplication.com.br/css/style.css”;
target/app/css/style.scss
输出文件不会覆盖该文件,因此我将配置maven war插件放在文件style.scss之外。再见 我的另一个解决方案,很抱歉