2015-10-08 56 views
0

要使新版本的客户端(浏览器)缓存失效,我必须向我的资源url添加一个随机字符串参数。Maven生成url nocache参数字符串

我使用Spring MVC开发一个Web应用程序,并使用Maven构建项目。

我的问题是如何使用Maven生成这样的字符串?这道理时,我必须把一个变量在任何文件中的可能性,JSP,标签是这样的:

<link rel="stylesheet" type="text/css" href="/css/master.css?cache={random}" media="all"/> 

并与随机字符串替换变量同时建设。

+0

版本号也可以。但是我怎样才能在Maven的任何文件中替换它? –

回答

2

而不是在Maven构建期间生成随机字符串,您可以使用版本号。这对于每个版本都是不同的,并且适合您的使用情况。

为此,您可以使用maven-war-pluginfiltering功能。在你的JSP中,声明占位符${project.version}

<link rel="stylesheet" type="text/css" href="/css/master.css?cache=${project.version}" media="all"/> 

然后,在Maven构建,可以过滤文件和Maven会自动用当前版本替换此占位符。

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
    <webResources> 
     <resource> 
     <directory>src/main/webapp</directory> 
     <filtering>true</filtering> 
     </resource> 
    </webResources> 
    </configuration> 
</plugin> 

如果你真的想生成一个随机字符串,你可以使用maven-antrun-plugin与以下任务(从this answer拍摄):

<scriptdef name="generateguid" language="javascript"> 
    <attribute name="property" /> 
    <![CDATA[ 
    importClass(java.util.UUID); 

    project.setProperty(attributes.get("property"), UUID.randomUUID()); 
    ]]> 
</scriptdef> 

<generateguid property="guid1" /> 
<echo message="${guid1}" /> 

属性然后guid1将持有的随机字符串,请务必在插件配置中将exportAntProperties设置为true。然后,您可以使用与${guid1}占位符相同的逻辑(资源过滤),而不是${project.version}

+0

声明插件后我得到08-OCT-2015 14:21:02.740严重[RMI TCP连接(2)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild:开始: 有机apache.catalina.LifecycleException:未能启动成分[StandardEngine [卡塔利娜] .StandardHost [本地主机] .StandardContext []] 。任何想法? –

+0

@RobertMoszczynski这似乎是一个错误建立服务器启动。该属性是否在WAR文件中正确替换? – Tunaki

+0

是的,它被正确地替换了。问题解决了,解决方案非常酷。谢谢!但也许你还有一个想法如何解决Tomcat问题。 –

-1

正如Tunaki所提议的那样,您可以使用版本号而不是随机数。 在这两种情况下,Maven Resources Plugin及其过滤器选项都会对您有所帮助。

请参见:http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

编辑:你可以得到的版本号与Maven的${project.version}财产。

+0

'maven-resources-plugin'在这里不适用,因为我们在这里讨论的是一个JSP – Tunaki

+0

是的,的确,我正在考虑Maven War Plugin的过滤选项,但回答太快.. –

0

您可以利用Maven资源插件的filtering功能。

Here是您如何指定网络资源的资源插件配置。 WAR插件在内部使用资源插件,因此配置完全相同,您可以参考资源插件的文档。

+0

'maven-resources-plugin '这里不​​适合,因为我们在这里讨论的是一个JSP – Tunaki

+0

当然可以。你如何看待文件从src/main/webapp'复制到'target'文件夹?WAR插件在内部使用资源插件来复制文件,因此配置选项是相同的。 – sh0rug0ru

+0

让我重新说明一下,根据Maven术语,JSP不是主要资源,它是一个webapp文件,所以不应该由此插件处理。你将不得不指定你过滤src/main/webapp,这会将这些文件添加到jar中。在你编辑的答案中,你链接到'maven-WAR-plugin'文档,而不是'maven-resources-plugin'。 – Tunaki