Rumah > Java > javaTutorial > teks badan

Bagaimana untuk Memuatkan Sumber dari Classpath Menggunakan Protokol URL Tersuai dalam Java?

Susan Sarandon
Lepaskan: 2024-11-18 02:56:02
asal
398 orang telah melayarinya

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

URL untuk memuatkan sumber daripada laluan kelas dalam Java

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.

Pernyataan Masalah

Adakah terdapat protokol untuk memuatkan sumber menggunakan pemuat kelas semasa? Ini serupa dengan protokol Jar, tetapi tanpa menyatakan balang atau folder kelas tertentu.

Penyelesaian

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();
    }
}
Salin selepas log masuk

Penggunaan:

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

Pertimbangan Tambahan:

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()))
Salin selepas log masuk

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);
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan