PF 3.5.10,Mojarra 2.1.21,全向 1.5
我有一个 JSF 库(只有 css 文件)。该库位于 .jar 文件中。 css 将包含在 xhtml 中<h:outputStylesheet library="mylib" name="css/mycss.css">
.
在 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?
最佳答案
不幸的是,这是不可能的。 JAR 中的资源不支持库版本控制。
你基本上有两个选择:
#{startup}
托管 bean 指的是 java.util.Date
应用范围实例:<h:outputStylesheet ... name="some.css?#{startup.time}" />
<h:outputScript ... name="some.js?#{startup.time}" />
或者,您可能已经将该版本作为某个应用程序变量。
<h:outputStylesheet ... name="some.css?v=#{app.version}" />
<h:outputScript ... name="some.js?v=#{app.version}" />
更新 :尽管如此,这不适用于
<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/1216 ResourceHandler
.public class MyVersionResourceHandler extends ResourceHandlerWrapper {
private ResourceHandler wrapped;
public MyVersionResourceHandler(ResourceHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public Resource createResource(String resourceName) {
return createResource(resourceName, null, null);
}
@Override
public Resource createResource(String resourceName, String libraryName) {
return createResource(resourceName, libraryName, null);
}
@Override
public Resource createResource(String resourceName, String libraryName, String contentType) {
final Resource resource = super.createResource(resourceName, libraryName, contentType);
if (resource == null) {
return null;
}
return new ResourceWrapper() {
@Override
public String getRequestPath() {
return super.getRequestPath() + "&v=1.0";
}
@Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2).
public String getResourceName() {
return resource.getResourceName();
}
@Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2).
public String getLibraryName() {
return resource.getLibraryName();
}
@Override // Necessary because this is missing in ResourceWrapper (will be fixed in JSF 2.2).
public String getContentType() {
return resource.getContentType();
}
@Override
public Resource getWrapped() {
return resource;
}
};
}
@Override
public ResourceHandler getWrapped() {
return wrapped;
}
}
或者,如果您碰巧已经使用 OmniFaces,则可以更简单地完成:
public class YourVersionResourceHandler extends DefaultResourceHandler {
public YourVersionResourceHandler(ResourceHandler wrapped) {
super(wrapped);
}
@Override
public Resource decorateResource(Resource resource) {
if (resource == null || !"mylib".equals(resource.getLibraryName())) {
return resource;
}
return new RemappedResource(resource, resource.getRequestPath() + "&v=1.0");
}
}
无论哪种方式,要让它运行,请将其注册为
<resource-handler>
在 /META-INF/faces-config.xml
的 JAR。<application>
<resource-handler>com.example.MyVersionResourceHandler</resource-handler>
</application>
关于jsf-2 - 如何对 jar 中的资源使用 JSF 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18143383/