【发布时间】:2011-12-09 21:39:03
【问题描述】:
我正在尝试找出一种方法,可以同时重命名我的 Web 项目中的静态文件。
我真正需要的是能够过滤我所有的静态文件名以添加版本号或类似的东西,以避免它们被浏览器缓存。
类似于将 custom.css 转换为 custom-1.23.css,其中 1.23 将是给定过滤器的值。
这种行为看起来非常类似于资源插件对文件内容所做的事情,但我找不到对文件名做同样事情的方法。
有人知道类似的吗?
非常感谢
【问题讨论】:
我正在尝试找出一种方法,可以同时重命名我的 Web 项目中的静态文件。
我真正需要的是能够过滤我所有的静态文件名以添加版本号或类似的东西,以避免它们被浏览器缓存。
类似于将 custom.css 转换为 custom-1.23.css,其中 1.23 将是给定过滤器的值。
这种行为看起来非常类似于资源插件对文件内容所做的事情,但我找不到对文件名做同样事情的方法。
有人知道类似的吗?
非常感谢
【问题讨论】:
您可以更改提供服务的目录而不是文件名,例如
/static/${version}/custom.css
资源插件可以让你在战争中改变目标目录。
【讨论】:
1) 使用任何能够复制和重命名资源的 Maven 插件。例如,copy-rename-maven-plugin。配置插件复制所有你想要版本化的静态资源,并将它们放入目标目录内的一个新目录中,例如 target/static_versioned:
<plugin>
<groupId>com.coderplus.maven.plugins</groupId>
<artifactId>copy-rename-maven-plugin</artifactId>
<version>1.0.1</version>
<executions>
<execution>
<id>copy-file</id>
<phase>generate-sources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<fileSets>
<fileSet>
<sourceFile>src/main/webapp/css/style.css</sourceFile>
<destinationFile>target/static_versioned/css/style_${project.version}.css</destinationFile>
</fileSet>
<fileSet>
<sourceFile>src/main/webapp/js/app.js</sourceFile>
<destinationFile>target/static_versioned/js/app_${project.version}.js</destinationFile>
</fileSet>
</fileSets>
</configuration>
</execution>
</executions>
</plugin>
2) 配置 maven-war-plugin 以在您的 war 文件中添加版本化静态文件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<webResources>
<resource>
<directory>target/static_versioned</directory>
</resource>
</webResources>
</configuration>
</plugin>
3) Maven 将版本化文件和原始文件都复制到结果 war 文件中,因此需要排除原始文件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<packagingExcludes>**/css/style.css,**/js/app.js</packagingExcludes>
<webResources>
<resource>
<directory>target/static_versioned</directory>
</resource>
</webResources>
</configuration>
</plugin>
值得一提的是,目标目录还有原始文件和版本文件,但是war文件只包含版本文件。
4) 使用 maven-war-plugin 的过滤功能重命名静态资源链接,以便所有链接都指向版本化资源:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<packagingExcludes>**/css/style.css,**/js/app.js</packagingExcludes>
<webResources>
<resource>
<directory>target/static_versioned</directory>
</resource>
<resource>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
</resource>
</webResources>
</configuration>
</plugin>
例如,<script type="text/javascript" src="js/app_${project.version}.js"></script> 之类的链接将被重命名为 <script type="text/javascript" src="js/app_1.0-SNAPSHOT.js"></script>
完整的例子在这里:https://github.com/dmitrysobolev/maven-war-plugin-js-versioning-example
【讨论】: