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() + "&amp;v=" + Constants.VERSION;

Constants 是 PrimeFaces 特定常量文件,每个 PF 版本都会更新。

【讨论】:

我明白了,我之前弄乱了路径,我有类似资源/js/default/mainscript.js 的东西。然后我将其更改为 resources/js/default/1_0_0/mainscript.js 并将其称为这样的 不起作用。看到您的答案后,我将其更改为 resources/js/1_0_0/default/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 资源版本控制的主要内容,如果未能解决你的问题,请参考以下文章

REST api 版本控制(仅版本表示,而不是资源本身)

jsf 2.0 上的 JSF1064“无法找到或提供资源”警告

Spring MVC 和 Thymeleaf 资源版本控制

Egret之版本控制

Gulp:静态资源(css,js)版本控制

无法使用 Spring Webflux 和 Thymeleaf 对静态资源进行版本控制