1

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

我们是这个特定库的创建者,在开发过程中,将它放在主类路径上要容易得多。

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

4

3 回答 3

4

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

对于 Facelets 资源,这可以通过ResourceResolverwebapp 本身的自定义来实现。

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. 另请参阅如何引用 JAR 文件中提供的 JSF 托管 bean?

于 2013-03-28T16:09:45.627 回答
0

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

于 2013-03-28T16:10:15.507 回答
0

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

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

在启动时,jetty 运行时会自动加载顶层 $jetty.home/lib 中的所有 jar,以及某些子目录,例如 $jetty.home/lib/management/、$jetty.home/lib/naming/ 等,其中在 start.jar 中包含的 start.config 文件中明确命名。此外,它将递归地从 $jetty.home/lib/ext 加载所有 jar。因此,要向 jetty 添加额外的 jar,您可以简单地在 $jetty.home/lib/ext 中创建一个任意深度的文件层次结构来包含这些 jar。当然,您始终可以通过创建自己的 start.config 文件并改用它来更改此默认行为。

于 2013-03-28T16:13:13.320 回答