Dalam Java, sumber boleh dimuatkan menggunakan pelbagai protokol URL, membolehkan pemisahan antara pemuatan sumber dan aplikasi yang menggunakannya. URL diwakili sebagai rentetan ringkas, menjadikan pemuatan sumber sangat boleh dikonfigurasikan.
Adakah terdapat protokol untuk memuatkan sumber menggunakan pemuat kelas semasa? Ini serupa dengan protokol Jar, tetapi tanpa menyatakan balang atau folder kelas tertentu.
Ini boleh dicapai menggunakan URLStreamHandler tersuai, yang membuka sambungan ke URL tertentu. Pengendali dinamakan hanya sebagai "Pengendali," membenarkan pengambilan automatik apabila ditentukan menggunakan java -Djava.protocol.handler.pkgs=org.my.protocols.
Pelaksanaan Asas:
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(); } }
Penggunaan:
new URL("classpath:org/my/package/resource.extension").openConnection();
Spesifikasi Pengendali Kod Manual:
Jika kod dikawal, pengendali boleh ditentukan secara manual:
new URL(null, "classpath:some/package/resource.extension", new org.my.protocols.classpath.Handler(ClassLoader.getSystemClassLoader()))
Pendaftaran Pengendali JVM:
Penyelesaian paling komprehensif ialah mendaftarkan URLStreamHandlerFactory yang mengendalikan semua URL merentas JVM:
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); } }
Kemudian hubungi URL.setURLSreamHandlerFactory() dengan kilang yang dikonfigurasikan untuk mendaftarkan pengendali.
Isu Pendaftaran Pengendali JVM:
Kaedah ini hanya boleh dipanggil sekali bagi setiap JVM, dan Tomcat boleh cuba mendaftarkan pengendali JNDInya. Menggunakan Jeti atau URLStreamHandlerFactory tersuai dengan pendekatan ThreadLocal adalah disyorkan.
Lesen:
Penyelesaian dikeluarkan ke domain awam, dengan permintaan untuk memulakan projek OSS untuk pengubahsuaian.
Atas ialah kandungan terperinci Bagaimana untuk Memuatkan Sumber dari Classpath Menggunakan Protokol URL Tersuai dalam Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!