首頁 >Java >java教程 >如何在 Java 中使用自訂 URL 協定從類別路徑載入資源?

如何在 Java 中使用自訂 URL 協定從類別路徑載入資源?

Susan Sarandon
Susan Sarandon原創
2024-11-18 02:56:02459瀏覽

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

Java 中從類別路徑載入資源的URL

在Java 中,可以使用各種URL 協定載入資源,從而實現資源載入和使用它的應用程式之間的分離。 URL 表示為簡單的字串,使得資源載入高度可配置。

問題陳述

是否有使用目前類別載入器載入資源的協定?這與 Jar 協定類似,但無需指定特定的 jar 或類別資料夾。

解決方案

這可以使用自訂 URLStreamHandler 來實現,它會開啟到給定 URL 的連線。 Handler 簡單地命名為“Handler”,允許在使用 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 Handler 註冊:

最全面的解決方案是註冊一個URLStreamHandlerFactory 來處理跨JVM 的所有URL:

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() 來註冊handler.

JVM 處理程序註冊問題:

每個JVM 只能呼叫此方法一次,Tomcat 可能會嘗試註冊其JNDI 處理程序。建議使用 Jetty 或自訂 URLStreamHandlerFactory 與 ThreadLocal 方法。

許可證:

該解決方案已發佈到公共領域,並請求啟動 OSS 專案用於修改。

以上是如何在 Java 中使用自訂 URL 協定從類別路徑載入資源?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn