Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文本Web资源的Maven字符串替换_Java_Maven 2_Package_War_Phase - Fatal编程技术网

Java 文本Web资源的Maven字符串替换

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

我有一个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}。字符串替换可能是唯一的选择

选项

  • 在复制到target/project-1.0-SNAPSHOT目录之后、创建WAR之前修改文本文件

  • 打包后,从WAR中提取文本文件,对其进行修改,然后将其添加回WAR中


  • 我在想,我还缺少另一个选择。有人认为吗?

    选项1不可行,
    准备软件包
    太早,
    软件包
    太迟了,所以我不知道在哪里可以插入任何自定义工作。选项2是可行的,但在IMO中是痛苦的。因此,这里还有一些建议(都基于AntRun和and/or任务)

    解决方案1:

  • 创建一个新文件夹,在其中放置需要处理的文本文件
  • 将antrun插件绑定到
    prepare package
    ,并将其配置为处理文件,并将处理后的文件放在
    target
    下的某个目录中(例如
    target/textfilesdir
  • 将war插件配置为包含
    target/textfilesdir
    作为
    webResource
    。有关详细信息,请参阅
  • 解决方案2:

  • 将antrun插件绑定到
    prepare package
    ,并将其配置为处理
    src/main/webapp/textfilesdir
    中的文本文件,并将处理后的文件放入
    target/project-1.0-SNAPSHOT
  • 配置war插件以排除先前处理的文件。有关详细信息,请再次参阅

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

    您可以使用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之外。再见

    我的另一个解决方案,很抱歉