1

特定の JSF ライブラリをすべて使用する多数の Web アプリケーションがあります。ライブラリを共通の場所またはメイン クラスパスに配置したいと考えています。問題は、システムがライブラリが 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 アノテーション スキャナーでスキャンする必要があるマネージド Bean などのアノテーション付き JSF アーティファクトの場合、これは不可能です。JAR は実際には/WEB-INF/lib. JAR ファイルで提供される JSF 管理対象 Bean を参照する方法も参照してください。

于 2013-03-28T16:09:45.627 に答える
0

jetty を使用しているため、おそらく最良の選択は、ライブラリを に配置することです$jetty.home/lib/ext

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

起動時に、jetty ランタイムは、$jetty.home/lib/management/、$jetty.home/lib/naming/ などの特定のサブディレクトリとともに、最上位の $jetty.home/lib からすべての jar を自動的に読み込みます。 start.jar に含まれる start.config ファイルで明示的に名前が付けられます。さらに、$jetty.home/lib/ext からすべての jar を再帰的にロードします。したがって、追加の jar を jetty に追加するには、$jetty.home/lib/ext 内に必要なだけ深いファイル階層を作成して、これらの jar を含めることができます。もちろん、独自の start.config ファイルを作成し、代わりにそれを使用することで、このデフォルトの動作をいつでも変更できます。

于 2013-03-28T16:13:13.320 に答える
0

Web サーバーが提供する共有フォルダー メカニズムを試すことができます。jar ファイルをそのフォルダーに配置します。どこからでもアクセスできます。

于 2013-03-28T16:10:15.507 に答える