Maison  >  Article  >  Java  >  Comment charger des ressources à partir du chemin de classe à l'aide d'un protocole URL personnalisé en Java ?

Comment charger des ressources à partir du chemin de classe à l'aide d'un protocole URL personnalisé en Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-18 02:56:02393parcourir

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

URL pour charger les ressources à partir du chemin de classe en Java

En Java, les ressources peuvent être chargées à l'aide de divers protocoles URL, permettant la séparation entre le chargement des ressources et l'application qui l'utilise. Une URL est représentée sous la forme d'une simple chaîne, ce qui rend le chargement des ressources hautement configurable.

Énoncé du problème

Existe-t-il un protocole pour charger des ressources à l'aide du chargeur de classe actuel ? Ceci est similaire au protocole Jar, mais sans spécifier de fichier jar ou de classe spécifique.

Solution

Cela peut être réalisé à l'aide d'un URLStreamHandler personnalisé, qui ouvre une connexion à une URL donnée. Le gestionnaire est simplement nommé « Handler », permettant une récupération automatique lorsqu'il est spécifié à l'aide de java -Djava.protocol.handler.pkgs=org.my.protocols.

Implémentation de base :

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();
    }
}

Utilisation :

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

Considérations supplémentaires :

Spécification du gestionnaire de code manuel :

Si le code est contrôlé, le gestionnaire peut être spécifié manuellement :

new URL(null, "classpath:some/package/resource.extension", new org.my.protocols.classpath.Handler(ClassLoader.getSystemClassLoader()))

Enregistrement du gestionnaire JVM :

La solution la plus complète consiste à enregistrer une URLStreamHandlerFactory qui gère toutes les URL à travers la 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);
    }
}

Appelez ensuite URL.setURLStreamHandlerFactory() avec la fabrique configurée pour enregistrer le gestionnaire.

Problème d'enregistrement du gestionnaire JVM :

Cette méthode ne peut être appelée qu'une seule fois par JVM, et Tomcat peut tenter d'enregistrer son gestionnaire JNDI. L'utilisation de Jetty ou d'une URLStreamHandlerFactory personnalisée avec une approche ThreadLocal est recommandée.

Licence :

La solution est publiée dans le domaine public, avec une demande de démarrage d'un projet OSS pour les modifications.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn