jsf-2 - 如何对 jar 中的资源使用 JSF 版本控制

标签 jsf-2 jar resources versioning

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 中的资源不支持库版本控制。

你基本上有两个选择:

  • 以简单而丑陋的方式进行,包括服务器的启动时间作为查询字符串。鉴于您使用的是 OmniFaces,您可以使用其内置 #{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/3945https://github.com/javaee/javaserverfaces-spec/issues/1395

    它适用于 <h:outputScript>不过,它有一个非常相似的错误报告,很快就实现了 https://github.com/javaserverfaces/mojarra/issues/1216
  • Do the same as PrimeFaces , 创建自定义 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/

    相关文章:

    java - Primefaces 列切换器从复选框列表中删除项目

    java - 通过按钮在 JSF 站点之外导航的选项

    java - 在 eclipse 中使用额外的 native 代码库导出到 Runnable jar

    c# - 需要知道应用程序何时关闭

    java - 解析 Jar 中的 XML 文件

    jquery - 如何使用 jQuery 选择 JSF 组件?

    java - 是否可以在模式面板内提交表单并在同一模式面板内获取结果?

    java - 从 JAR 文件中读取目录内容

    cmd 中的 JavaFX FXMLLoader 异常

    c++ - 尝试在 Visual Studio 2010 Pro SP1 中添加资源导致 C++ 项目出现 "The operation could not be completed. Unspecified error"消息