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.
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.
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();
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!