当前位置: 首页 > 知识库问答 >
问题:

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

顾学真
2023-03-14

我有一个JSF库(只有css文件)。这个库在一个.jar文件中。css将以 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?

共有1个答案

艾焱
2023-03-14

不幸的是,这是不可能的。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}" />
    

    但它适用于 ,它有一个非常类似的错误报告,很快就实现了https://github.com/javaserverfaces/mojarra/issues/1216

    执行与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");
        }
    
    }
    
    <application>
        <resource-handler>com.example.MyVersionResourceHandler</resource-handler>
    </application>
    

  •  类似资料:
    • 环境:JSF2.1.7Seam2.3.0JBoss5.1.2 我的应用程序有一个需要本地化的字符串 “我同意WorldSite的隐私政策和Cookie通知” 斜体的隐私政策和Cookie通知是指向其他页面的超链接。 最初我们的facets是这样设置的: 注意:我们已经准备好了URL重写,需要/jsf/Notice。xhtml并重写为 这允许对各个键进行零碎的转换 但这需要一些语言的变通方法(在“i

    • 问题内容: 我在C 项目的资源中有一个版本资源,其中包含版本号,版权和构建详细信息。有一种简单的方法可以在运行时访问它,以填充我的“帮助/关于”对话框,因为我当前正在维护此信息的单独的const值。理想情况下,该解决方案应适用于Windows / CE移动版和Visual C 的早期版本(6.0或更高版本)。 问题答案: 这是我原始答案的编辑版本。

    • Android Studio建议在构建工作流程中使用gradle包装器。但是,如果您使用git进行版本控制,. jar文件会被忽略,并且据说不会签入,这是我得到的。但我的工作流程与普通人有点不同。我们也同时使用Team Foundation Server和git。使用自定义MSBuildTask调用gradle构建。这是我的. gitignore文件的样子: 它目前的工作方式是,首先我们将TFS和

    • 主要内容:JSF Web资源示例:访问图片文件,JSF Web资源示例:访问CSS文件,JSF Web资源示例:访问JavaScript文件JSF Web资源是在Web应用程序中正确呈现所需的资源。它包括图像,脚本(JS)文件和任何用户创建的组件库。 JSF提供了一种存储Web资源的标准方式。 您可以使用以下任何一种来存储资源。 它必须存储在Web应用程序根目录资源目录的子目录中:,如:,等等。 打包在Web应用程序的类路径中的资源必须位于Web应用程序中的目录的子目录中:。 您可以使用此文件结

    • 问题内容: 我有一个带有工具栏的Java项目,该工具栏上带有图标。这些图标存储在名为resources /的文件夹中,因此路径可能是“ resources / icon1.png”。该文件夹位于我的src目录中,因此在编译后,该文件夹将被复制到bin / 我正在使用以下代码访问资源。 (imageName将为“ resources / icon1.png”等)。在Eclipse中运行时,效果很好。

    • 编辑: 结构: A.jar(或A.war) | |src/main/resources/config。属性-(标记为p1) | ||依赖的罐子 当我运行A. jar(或A. war,因为B. jar可以由Web应用程序或java进程调用)时,我希望B. jar中的代码始终使用p1; 当我单独运行B. jar时,我希望B. jar中的代码使用p2 另一种描述方式是主jar/war中同名的资源文件(这