我试图找到管理浏览器缓存的最佳解决方案,以便在Java/Maven项目中重新加载修改过的JavaScript/CSS资源。最普遍的解决方案似乎是Maven过滤,在构建时向资源URL添加时间戳。例如:
<script type="text/javascript" src="resource.js?v=${maven.build.timestamp}"></script>
但是最有效的方法是添加文件的校验和/哈希(又名指纹)而不是构建日期,这样资源就不会在每次部署后重新加载,而是只在必要时重新加载。我正在拼命寻找使用Java或Maven插件的这个模型的正确/通用实现。
任何想法?
谢谢。
您确实希望使用指纹与查询参数。查询参数方法并不总是有效,而且大多数代理不会缓存它。更改URL或实际文件名效果更好。
下面是我在Maven, Git, Tomcat, Dojo项目中处理这个问题的方法。我使用http://mojo.codehaus.org/buildnumber-maven-plugin/获取Git版本,然后在构建WAR时使用过滤将值注入到jsp中。
pom.xml
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<doCheck>false</doCheck>
<doUpdate>false</doUpdate>
<shortRevisionLength>8</shortRevisionLength>
<revisionOnScmFailure></revisionOnScmFailure>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<warName>${project.name}-${project.version}-${buildNumber}</warName>
<webResources>
<resource>
<directory>src/main/webapp/WEB-INF/views/includes</directory>
<targetPath>WEB-INF/views/includes</targetPath>
<filtering>true</filtering>
</resource>
</webResources>
......
</configuration>
</plugin>
在我的主JSP include中有
<script src="${pageContext.request.contextPath}/${buildNumber}/static/js/ckeditor/ckeditor.js"></script>
<script src="${pageContext.request.contextPath}/${buildNumber}/static/js/build/dojo/dojo.js" data-dojo-config="parseOnLoad: true"></script>
做重写我使用http://tuckey.org/urlrewrite/。我只有一个简单的规则。
我的第一个过滤器条目web.xml
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
urlrewrite.xml
<rule match-type="regex">
<from>^/[0-9A-Za-z_.-]+/static/(.*)$</from>
<to>/static/$1</to>
</rule>
我还没有使用它,但是maven-fingerprint-plugin看起来不错。
它只需要一点maven配置,然后它会自动将文件中的所有url重新构建为手指版本。
无需在资源url中手动保留${buildNumber}
, ${hashVersion}
或其他指纹选择。
从存储库:
<pluginRepositories>
<pluginRepository>
<id>fprint-repo</id>
<url>https://raw.github.com/dernasherbrezon/maven-fingerprint-plugin/master/maven-fingerprint-plugin/mvn-repo</url>
</pluginRepository>
</pluginRepositories>
然后<executions>
<execution>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<excludeResources>
<excludeResource>://</excludeResource>
<excludeResource>//</excludeResource>
</excludeResources>
<!-- ${basedir}/src/main/webapp by default -->
<sourceDirectory>${basedir}/target/webcombined</sourceDirectory>
<!-- ${project.build.directory}/fingered-web by default -->
<outputDirectory>${basedir}/target/fingered</outputDirectory>
<!-- Remove unnecessary spaces between tags. Make single line page.
Takes into consideration <pre> tags -->
<trimTagExtensions>
<trimTagExtension>html</trimTagExtension>
</trimTagExtensions>
<extensionsToFilter>
<extensionToFilter>html</extensionToFilter>
<extensionToFilter>jsp</extensionToFilter>
<extensionToFilter>tag</extensionToFilter>
<extensionToFilter>css</extensionToFilter>
<extensionToFilter>js</extensionToFilter>
</extensionsToFilter>
<!-- cdn host. Not required. For example using
"//accountname.r.worldssl.net": /css/bootstrap.css =>
//accountname.r.worldssl.net/css/<md5>bootstrap.css -->
<cdn>${cdn}</cdn>
</configuration>