Maven字符串替换文本Web资源

Jac*_*erk 16 java maven-2 war package phase

我有一个带有文本文件的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.

我想在这里还有另一种选择我不在了.想什么?

小智 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>
Run Code Online (Sandbox Code Playgroud)

在真正的战争建立之前,我们制造了一场爆炸性战争.这意味着,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>
Run Code Online (Sandbox Code Playgroud)

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


Pas*_*ent 5

选项 1 不可行,prepare-package为时过早,package为时已晚,所以我不知道您可以在哪里插入任何自定义工作。选项 2 是可行的,但 IMO 很痛苦。所以这里有更多的建议(都基于 AntRun 和ReplaceRegExp和/或Replace任务)。

解决方案1:

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

解决方案2:

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

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