在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中文網其他相關文章!