如何从公共目录加载JSF / facelets库?

时间:2013-03-28 16:03:38

标签: jsf jsf-2 jetty facelets

我们有许多webapp都使用某个JSF库。我们想将库放在一个公共位置或主类路径上。问题是系统要求库位于WEB-INF / lib中,因此webapp类加载器可以扫描并加载它。

我们是这个特定库的创建者,在开发过程中,它更容易在主类路径上使用它。

这可能吗?任何人都可以举例说明在web.xml中放置什么来实现这一点(如果这是正确的机制)?

3 个答案:

答案 0 :(得分:4)

  

我们是这个特定库的创建者,在开发过程中,它更容易在主类路径上使用它。这可能吗?

对于Facelets资源,可以在webapp本身中使用自定义ResourceResolver

public class FaceletsResourceResolver extends ResourceResolver {

    private ResourceResolver parent;
    private String basePath;

    public FaceletsResourceResolver(ResourceResolver parent) {
        this.parent = parent;
        this.basePath = "META-INF/resources"; // TODO: Make configureable?
    }

    @Override
    public URL resolveUrl(String path) {
        URL url = parent.resolveUrl(path); // Resolves from WAR which would also do META-INF/resources of JARs in WAR.

        if (url == null) {
            url = getClass().getResource("/" + basePath + path); // Resolves from JARs in WAR when base path is not META-INF/resources.
        }

        if (url == null) {
            url = Thread.currentThread().getContextClassLoader().getResource(basePath + path); // Resolves also from anywhere else in classpath.
        }

        return url;
    }

}

要使其运行,请在webapp的web.xml中配置如下:

<context-param>
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
    <param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>

对于需要由JSF注释扫描程序扫描的带注释的JSF工件(如托管bean等),这是不可能的。 JAR真的最终会在/WEB-INF/lib。另请参阅How to reference JSF managed beans which are provided in a JAR file?

答案 1 :(得分:0)

您可以尝试随Web服务器提供的共享文件夹机制。 将jar文件放在该文件夹中。你可以在任何地方访问它们。

答案 2 :(得分:0)

由于您使用的是码头,或许您最好的选择是将您的库放在$jetty.home/lib/ext中:

  

http://docs.codehaus.org/display/JETTY/Classloading

     

在启动时,jetty运行时将自动加载来自的所有jar   顶级$ jetty.home / lib,以及某些子目录,如   $ jetty.home / lib / management /,$ jetty.home / lib / naming / etc,这些是   在start.jar中包含的start.config文件中命名为explicity。   此外,它将递归加载所有罐子   $ jetty.home / lib / ext目录。因此,要向码头添加额外的罐子,您可以简单地说   在$ jetty.home / lib / ext中创建一个尽可能深的文件层次结构   包含这些罐子。当然,您始终可以更改此默认值   通过创建自己的start.config文件并使用它来执行此操作   代替。