我有一个带有文本文件的Maven Web应用程序
的src /主/ web应用/ textfilesdir
据我了解,在打包阶段,这个textfilesdir目录将被复制到
中target / project-1.0-SNAPSHOT
目录,然后将其压缩为
目标/项目-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中。
我在想这里有另一种选择我不在了。有谁想?
答案 0 :(得分:7)
我遇到了同样的问题而且我在这个问题上摆弄了很多,所以尽管这个问题很老,但我会回答。正如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文件的整个内容存储在子目录中(默认情况下为target / $ {project.build.finalName})。之后,maven-replacer-plugin将按照我们的指定更改文件的内容。最后,.war将在default-war
作业的包装阶段打包。为了避免重写爆炸的war文件夹的内容,必须将warSourceDirectory
设置为存储爆炸的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
答案 1 :(得分:4)
选项1不可行,prepare-package
太早,package
为时已晚,所以我看不到您可以在哪里插入任何自定义工作。选项2是可行的但是痛苦的IMO。所以这里有一些更多的命题(所有命题都基于AntRun和ReplaceRegExp和/或Replace任务)。
解决方案1:
prepare-package
并配置它以处理文件并将处理过的文件放在target
下的某个目录中(例如target/textfilesdir
)。target/textfilesdir
包含为webResource
。有关详细信息,请参阅Adding and Filtering External Web Resources。解决方案2:
prepare-package
并将其配置为处理来自src/main/webapp/textfilesdir
的文本文件,并将处理后的文件放入target/project-1.0-SNAPSHOT
。我想我会选择第二个解决方案。
答案 2 :(得分:3)
我遇到了阶段的问题,使用prepare-package没有将文件复制到战争中,我的解决方案是:
在maven-war-plugin中添加此配置
<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>
输出文件没有覆盖文件,所以我把配置maven-war-plugin排除文件style.scss。再见!
答案 3 :(得分:2)
我的另一个解决方案,抱歉迟到了派对,但仍然可能对某些人有用。上面的解决方案对我来说根本不起作用,因为我有覆盖,因此使用替换插件在主要来源很难。因此,我使用maven-war-plugin在prepare-package阶段为我生成临时目录,并使用replacer插件来操作它并从该目录释放战争,以便其他任何内容都不会覆盖它。
<plugin>
<artifactId>maven-war-plugin</artifactId>
<executions>
<execution>
<id>prepare</id>
<phase>prepare-package</phase>
<goals>
<goal>exploded</goal>
</goals>
<configuration>
<webappDirectory>${project.build.directory}/${project.build.finalName}-patched/</webappDirectory>
</configuration>
</execution>
<execution>
<id>default-war</id>
<phase>package</phase>
<goals>
<goal>war</goal>
</goals>
<configuration>
<useCache>true</useCache>
<warSourceDirectory>${project.build.directory}/${project.build.finalName}-patched/</warSourceDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>replace</goal>
</goals>
</execution>
</executions>
<configuration>
<file>${project.build.directory}/${project.build.finalName}-patched/fileToBeChanged.txt</file>
<token>ValueToChange</token>
<value>ValueToReplace</value>
</configuration>
</plugin>
答案 4 :(得分:1)
您可以使用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>
<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>
但是你还需要两个技巧。一个是将爆炸目标添加到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>
最后需要在包之前调用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>
如果您使用的是比2.0.1更新的maven-war-plugin版本,则需要在maven-war-plugin的配置中包含true,否则对文件的更改将是当war插件第二次复制你的webapp时,会出现问题。如果您使用的是Hudson / Jenkins,则必须使用比2.0.1更新的版本。