使用Maven构建WAR文件时重命名静态文件

时间:2015-03-04 16:17:35

标签: java maven maven-3 maven-plugin maven-war-plugin

我想在使用maven-war-plugin构建我的WAR文件时重命名静态文件,版本号。对于intance,在我的项目中我有一个文件:

src/main/webapp/css/my.css

我希望它在WAR文件中显示为:

css/my-versionNumber.css

已经提出同样的问题(参见Rename static files on maven war build),但接受的答案是重命名目录。我不想重命名目录,我想重命名实际文件。

这可能吗?

2 个答案:

答案 0 :(得分:2)

好的,我找到了一种方法,原则来自:Automatic update of generated css files via m2e

  1. 重命名文件

    我选择使用Maven AntRun Plugin,因为它允许使用替换模式重命名多个文件,有关详细信息,请参阅https://stackoverflow.com/a/16092997/1768736

    使用替代解决方案:

  2. 使重命名的文件可用于maven-war-plugin

    • 复制文件:我们的想法是将重命名的文件复制到临时目录中,由maven-war-plugin作为网络资源添加到WAR文件中。 maven-war-pluginpackaging阶段构建WAR,因此我们需要在此之前复制重命名的文件。

    • 阻止maven-war-plugin管理maven-antrun-plugin要重命名的文件:这是通过使用参数warSourceExcludes来完成的。

  3. 使用m2e-wtp

    在Eclipse中工作
    • 更改生命周期映射:问题是m2e默认情况下不会执行POM文件中定义的所有生命周期(要查看执行/忽略的生命周期,请从Eclipse中转到项目中)属性,然后Maven> Lifecycle Mapping)。因此,您需要使用假插件org.eclipse.m2e.lifecycle-mapping添加maven-antrun-plugin生命周期,请参阅life cycle mapping documentation

    • 更改maven-antrun-plugin输出目录:问题是m2e-wtp在启动任何生命周期之前获取其网络资源,因此,maven-antrun-plugin之前可以重命名文件。作为一种变通方法,我们创建一个仅在项目由m2e构建时激活的配置文件,以更改用于设置maven-antrun-plugin输出目录的属性,直接写入m2e-wtp网络资源。

  4. 那就是它! POM片段:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                http://maven.apache.org/xsd/maven-4.0.0.xsd">
      ...
    
      <properties>
        <!-- properties used to rename css files with version number. -->
        <css.version>${project.version}</css.version>
        <!-- Temp directory where to copy renamed files, later added by maven-war-plugin as web-resources. -->
        <rename.tmp.directory>${project.build.directory}/rename_tmp</rename.tmp.directory>
      </properties>
    
      <!-- There is a problem when running the webapp from Eclipse: m2e-wtp acquires 
      the web-resources before any lifecycle can be launched, so, before 
      maven-antrun-plugin can rename the files. We define a profile so that 
      maven-antrun-plugin copies files directly into the m2e-wtp web-resources directory, 
      when running from Eclipse.  -->
      <profiles>
        <profile>
          <id>m2e</id>
          <!-- This profile is only active when the property "m2e.version"
          is set, which is the case when building in Eclipse with m2e, 
          see https://stackoverflow.com/a/21574285/1768736. -->
          <activation>
            <property>
              <name>m2e.version</name>
            </property>
          </activation>
          <properties>
            <rename.tmp.directory>${project.build.directory}/m2e-wtp/web-resources/</rename.tmp.directory>
          </properties>
        </profile>
      </profiles>
    
      ... 
    
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>run</goal>
                </goals>
                <id>rename-resources</id>
                <!-- perform copy before the package phase, 
                when maven-war-plugin builds the WAR file -->
                <phase>process-resources</phase>
                <configuration>
                  <target>
                    <!-- copy renamed files. -->
                     <copy todir="${rename.tmp.directory}/css/">
                       <fileset dir="src/main/webapp/css/">
                         <include name="**/*.css" />
                       </fileset>
                       <!-- See other Mappers available at http://ant.apache.org/manual/Types/mapper.html -->
                       <mapper type="glob" from="*.css" to="*-${css.version}.css"/>
                     </copy>
                   </target>
                </configuration>
              </execution>
            </executions>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
              <!-- We do no let the maven-war-plugin take care of files that will be renamed. 
              Paths defined relative to warSourceDirectory (default is ${basedir}/src/main/webapp) -->
              <warSourceExcludes>css/</warSourceExcludes>
              <webResources>
              <!-- include the resources renamed by maven-antrun-plugin, 
              at the root of the WAR file -->
                <resource>
                  <directory>${rename.tmp.directory}</directory>
                  <includes>
                    <include>**/*</include>
                  </includes>
                </resource>
              </webResources>
            </configuration>
          </plugin>
    
          ...
        </plugins>
    
    
        <!-- When running server from Eclipse, we need to tell m2e to execute 
        maven-antrun-plugin to rename files, by default it doesn't. We need to modify the life cycle mapping. -->
        <pluginManagement>
          <plugins>
            <!-- This plugin is not a real one, it is only used by m2e to obtain 
            config information. This is why it needs to be put in the section 
            pluginManagement, otherwise Maven would try to download it. -->
            <plugin>
              <groupId>org.eclipse.m2e</groupId>
              <artifactId>lifecycle-mapping</artifactId>
              <version>1.0.0</version>
              <configuration>
                <lifecycleMappingMetadata>
                  <pluginExecutions>
                    <pluginExecution>
                      <pluginExecutionFilter>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <versionRange>[1.0.0,)</versionRange>
                        <goals>
                          <goal>run</goal>
                        </goals>
                      </pluginExecutionFilter>
                      <action>
                        <execute>
                          <!-- set to true, otherwise changes are not seen, 
                          e.g., to a css file, and you would need to perform 
                          a project update each time. -->
                          <runOnIncremental>true</runOnIncremental>
                        </execute >
                      </action>
                    </pluginExecution>
                  </pluginExecutions>
                </lifecycleMappingMetadata>
              </configuration>
            </plugin>
          </plugins>
        </pluginManagement>
    
        ...
    
      </build>
    
        ...
    </project>
    

答案 1 :(得分:-1)

您需要定义

<properties>
    <css.version>1.1.0</css.version>
</properties>

之后由EL调用它 CSS / $ {css.version}的CSS