JSF 资源版本控制
Posted
技术标签:
【中文标题】JSF 资源版本控制【英文标题】:JSF resource versioning 【发布时间】:2012-04-13 08:07:15 【问题描述】:我正在尝试对应用程序中的资源进行版本控制。
如果我喜欢这个资源/js/1_0_0/mainscript.js
它不起作用。它说 RESOURCE_NOT_FOUND
但是当我这样做时
资源/js/mainscript.js/1_0_0.js
它有效。我不喜欢第二种方式的组织方式。第一个看起来很酷。有什么想法吗?
我正在使用 Tomcat 7.0、JSF 2.0.9
更新:我正在检查 primefaces-2-2.1.jar。因为当我检查页面源时,我看到了这个 /javax.faces.resource/jquery/jquery.js.xhtml?ln=primefaces&v=2.2.1">
然后我查看了 META-INF/resources/primefaces/jquery/jquery.js
他们没有任何版本控制,但它是如何在头部附加 v=2.2.1 的
【问题讨论】:
【参考方案1】:如果我喜欢这个资源/js/1_0_0/mainscript.js
它不起作用。它说 RESOURCE_NOT_FOUND
如果您指定 js
作为库名称,这将起作用。
<h:outputScript library="js" name="mainscript.js" />
但是,这不是资源库的正确用法。而是介绍一个。
resources/default/1_0_0/js/mainscript.js
那么你可以指定如下:
<h:outputScript library="default" name="js/mainscript.js" />
他们没有任何版本控制,但它是如何在头部附加 v=2.2.1 的
它由PrimeResource
完成,它使用ln=primefaces
参数启动资源请求。它的getRequestPath()
有以下实现:
@Override
public String getRequestPath()
return super.getRequestPath() + "&v=" + Constants.VERSION;
Constants
是 PrimeFaces 特定常量文件,每个 PF 版本都会更新。
【讨论】:
我明白了,我之前弄乱了路径,我有类似资源/js/default/mainscript.js 的东西。然后我将其更改为 resources/js/default/1_0_0/mainscript.js 并将其称为这样的library="js"
、library="css"
等是一种气味,表示误解了library
属性的含义。
请注意,由于 mojarra 中的性能问题,primefaces 在 v3.3 中删除了资源版本控制 - 请参阅 primefaces issue#3705 和 mojarra issue#2494
最高版本的拾取器是否只对战争中的资源有效?我尝试将资源放在 jar 的 META-INF/resources/library/1_0_0/... 文件夹中,并将该 jar 放在我的 WEB-INF/lib 中,但它没有用。将资源从罐子转移到战争中奏效了。此外,将版本作为名称的一部分并将资源保留在 jar 中也很有效。以上是关于JSF 资源版本控制的主要内容,如果未能解决你的问题,请参考以下文章