PF 3.5.10,Mojarra 2.1.21,omnifaces 1.5
我有一个JSF库(仅限css文件) . 该库位于.jar文件中 . css将包含在带有 <h:outputStylesheet library="mylib" name="css/mycss.css">
的xhtml中 .
在html中,它呈现如下: localhost:8080/cms/javax.faces.resource/css/mycss.css.jsf?ln=mylib
primefaces的CSS文件呈现为: localhost:8080/cms/javax.faces.resource/primefaces.js.jsf?ln=primefaces&v=3.5.10
注意最后的库版本(&3.5.10) . 我怎么能做同样的事情?我应该在Manifest.mf中编写版本吗?或者如何在jar文件中使用jsf-versioning?
3 回答
遗憾的是,这是不可能的 . JAR中的资源不支持库版本控制 .
你基本上有两个选择:
#{startup}
托管bean引用java.util.Date
实例:或者您可能已将该版本作为某个应用程序变量 .
Update :尽管如此,这对
<h:outputStylesheet>
无效 . 另见:https://github.com/javaserverfaces/mojarra/issues/3945或https://github.com/javaee/javaserverfaces-spec/issues/1395它适用于
<h:outputScript>
,它有一个非常简单的错误报告,很快就实现了https://github.com/javaserverfaces/mojarra/issues/1216ResourceHandler
.或者,如果您碰巧已经使用过OmniFaces,可以更简单地完成:
无论哪种方式,要使其运行,请在JAR的
/META-INF/faces-config.xml
中将其注册为<resource-handler>
.您还可以使用项目版本并将其作为资源文件的版本号附加 . 这可以使用
maven-war-plugin
来完成 .maven-war-plugin
将在构建期间查看您的页面并替换已定义的属性 .以下示例说明如何配置
maven-war-plugin
以过滤webapp资源以注入自定义属性asset.version
:pom.xml
然后可以在您的JSF文件中使用
asset.version
属性 .以下是使用JSF 2.2测试的示例:
结果(在我的情况下)将是以下内容:
@Balusc回复说“好吧,不是一个bug,但监督和规范失败” . 似乎在库中部署的css资源无法使用mojarra 2.2.14进行版本控制 . 这样对吗?我尝试使用自定义ResourceHandler实现您的解决方案,但getWrapped()返回的资源.createResource(resourceName,libraryName)始终返回null . 似乎createResource()尝试使用路径/ META-INF / resources /查找库的资源(如css / layout.css),但它缺少版本 .
为了解决这个问题,我在自定义ResourceHandler上覆盖了createResource方法,该方法扩展了Omnifaces DefaultResourceHandler以向resourceName添加版本前缀
通过此解决方法,生成的链接看起来像
对于outputStylesheet声明
我不确定这是最好的解决方法 .