【问题标题】:Maven String Replace of Text Web Resources文本 Web 资源的 Maven 字符串替换
【发布时间】:2010-06-10 20:50:20
【问题描述】:

我有一个 Maven Web 应用程序,其中包含文本文件

src/main/webapp/textfilesdir

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

target/project-1.0-SNAPSHOT

目录,然后压缩成一个

target/project-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. 在复制到 target/project-1.0-SNAPSHOT 目录后修改文本文件,但在 WAR 创建之前。

  2. 打包后,从WAR中提取文本文件,修改后重新添加到WAR中。

我在想这里还有另一个选择。有人想吗?

【问题讨论】:

    标签: java maven-2 package war phase


    【解决方案1】:

    我遇到了同样的问题,而且我一直在摆弄这个问题,所以我会回答,尽管这个问题已经很老了。正如leadro 和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 作业在打包阶段打包。为避免爆炸战争文件夹的内容被覆盖,必须将warSourceDirectory 设置为存储爆炸战争资料的目录。以下配置 sn -p 将完成这项工作:

    <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

    【讨论】:

      【解决方案2】:

      选项 1 不可行,prepare-package 太早了,package 太晚了,所以我看不出你可以在哪里插入任何自定义工作。选项 2 是可行的,但 IMO 很痛苦。所以这里还有一些提议(全部基于 AntRun 和 ReplaceRegExp 和/或 Replace 任务)。

      解决方案 1:

      1. 创建一个新文件夹,放置需要处理的文本文件。
      2. 将antrun插件绑定到prepare-package并配置它来处理文件并将处理后的文件放在target下的某个目录下(例如target/textfilesdir)。
      3. 配置战争插件以包含target/textfilesdir 作为webResource。详情请参考Adding and Filtering External Web Resources

      解决方案 2:

      1. 将antrun插件绑定到prepare-package,配置它处理来自src/main/webapp/textfilesdir的文本文件,并将处理后的文件放到target/project-1.0-SNAPSHOT中。
      2. 配置war插件以排除之前处理​​的文件。再次,请参阅Adding and Filtering External Web Resources 了解详情。

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

      【讨论】:

      • 像往常一样,我建议使用 gmaven (docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code) 来嵌入 groovy 而不是 ant,否则我完全同意 (+1)
      • @seanizer:我需要多思考一下 Groovy :) 在这里肯定会很好玩。
      • 是的。虽然我不太热衷于构建 groovy 应用程序(grails 等),但我认为 groovy 作为一种脚本语言绝对被低估了
      • 同意,选项 2 听起来不错。我想知道是否可能有另一种方法,但这比我最初想象的要少。谢谢!蚂蚁来拯救? :)
      【解决方案3】:

      我遇到了阶段问题,使用prepare-package没有将文件复制到war,我的解决方案是:

      在 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 之外。再见!

      【讨论】:

        【解决方案4】:

        我的另一个解决方案,很抱歉迟到了,但仍然可能对某些人有用。上面的解决方案根本不适合我,因为我有覆盖,因此在主要来源中使用替换插件很困难。因此,我在准备包阶段使用 maven-war-plugin 为我生成临时目录,并使用替换插件来操作它并从该目录中释放战争,以便没有其他任何东西被它覆盖。

              <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>
        

        【讨论】:

          【解决方案5】:

          你可以使用 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插件中添加explode目标:

          <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>
          

          如果您使用的 maven-war-plugin 版本高于 2.0.1,则需要在 maven-war-plugin 的配置中包含 true,否则对文件的更改将是当战争插件第二次复制你的 web 应用程序时会出现斑点。如果您使用的是 Hudson/Jenkins,则必须使用高于 2.0.1 的版本。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-09-24
            • 1970-01-01
            • 1970-01-01
            • 2015-11-04
            • 1970-01-01
            • 2012-03-24
            • 2011-01-12
            相关资源
            最近更新 更多