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 サイトの他の関連記事を参照してください。