ホームページ  >  記事  >  Java  >  Java でカスタム URL プロトコルを使用してクラスパスからリソースをロードする方法

Java でカスタム URL プロトコルを使用してクラスパスからリソースをロードする方法

Susan Sarandon
Susan Sarandonオリジナル
2024-11-18 02:56:02393ブラウズ

How to Load Resources from the Classpath Using a Custom URL Protocol in Java?

Java のクラスパスからリソースをロードするための URL

Java では、さまざまな URL プロトコルを使用してリソースをロードでき、リソースのロードとそれを使用するアプリケーションを分離できます。 URL は単純な文字列として表されるため、リソースの読み込みを高度に構成できます。

問題ステートメント

現在のクラスローダーを使用してリソースを読み込むプロトコルはありますか?これは Jar プロトコルに似ていますが、特定の jar またはクラス フォルダーを指定しません。

ソリューション

これは、指定された URL への接続を開くカスタム URLStreamHandler を使用して実現できます。ハンドラーの名前は単に「ハンドラー」であり、java -Djava.protocol.handler.pkgs=org.my.protocols.

Basic を使用して指定すると自動ピックアップが可能になります。実装:

package org.my.protocols.classpath;

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;

public class Handler extends URLStreamHandler {
    private final ClassLoader classLoader;

    public Handler() {
        this.classLoader = getClass().getClassLoader();
    }

    public Handler(ClassLoader classLoader) {
        this.classLoader = classLoader;
    }

    @Override
    protected URLConnection openConnection(URL u) throws IOException {
        final URL resourceUrl = classLoader.getResource(u.getPath());
        return resourceUrl.openConnection();
    }
}

使用法:

new URL("classpath:org/my/package/resource.extension").openConnection();

追加の考慮事項:

マニュアル コード ハンドラー仕様:

コードが制御されている場合、ハンドラーは手動で指定できます:

new URL(null, "classpath:some/package/resource.extension", new org.my.protocols.classpath.Handler(ClassLoader.getSystemClassLoader()))

JVM ハンドラーの登録:

最も包括的な解決策は、JVM 全体のすべての URL を処理する URLStreamHandlerFactory を登録することです。 :

package my.org.url;

import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.util.HashMap;
import java.util.Map;

class ConfigurableStreamHandlerFactory implements URLStreamHandlerFactory {
    private final Map<String, URLStreamHandler> protocolHandlers;

    public ConfigurableStreamHandlerFactory(String protocol, URLStreamHandler urlHandler) {
        protocolHandlers = new HashMap<>();
        addHandler(protocol, urlHandler);
    }

    public void addHandler(String protocol, URLStreamHandler urlHandler) {
        protocolHandlers.put(protocol, urlHandler);
    }

    public URLStreamHandler createURLStreamHandler(String protocol) {
        return protocolHandlers.get(protocol);
    }
}

次に、URL.setURLStreamHandlerFactory() を呼び出します。ハンドラーを登録するように構成されたファクトリー。

JVM ハンドラー登録の問題:

このメソッドは JVM ごとに 1 回のみ呼び出すことができ、Tomcat はその JNDI ハンドラーの登録を試行する可能性があります。 。 ThreadLocal アプローチで Jetty またはカスタム URLStreamHandlerFactory を使用することをお勧めします。

ライセンス:

ソリューションは、OSS プロジェクトの開始リクエストとともにパブリック ドメインにリリースされます。修正用。

以上がJava でカスタム URL プロトコルを使用してクラスパスからリソースをロードする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。