En Java, les développeurs ont accès à une API polyvalente de chargement de ressources utilisant divers protocoles d'URL. Cependant, bien que des protocoles tels que « file:// » et « http:// » facilitent la récupération de ressources à partir d'emplacements spécifiques, il peut s'avérer nécessaire d'accéder aux ressources à partir du chemin de classe de l'application sans spécifier explicitement le fichier jar ou le dossier de classe. Cet article explore une solution à cette exigence, en introduisant un protocole d'URL personnalisé et un gestionnaire de flux pour le chargement des ressources basé sur le chemin de classe.
Au cœur de la solution se trouve un URLStreamHandler qui s'ouvre connexions à l’URL spécifiée. Ce gestionnaire doit être enregistré auprès de la classe URL en utilisant le nom du package « simple » comme protocole pris en charge.
package org.my.protocols.classpath; 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(); } @Override protected URLConnection openConnection(URL u) /*throws IOException*/ { final URL resourceUrl = classLoader.getResource(u.getPath()); return resourceUrl.openConnection(); } }
Pour charger des ressources à l'aide du protocole personnalisé, utilisez le syntaxe suivante :
new URL("classpath:org/my/package/resource.extension").openConnection();
En spécifiant le chemin relatif au classpath, il devient possible de charger des ressources sans préciser leur emplacement spécifique au sein du classpath.
Pour garantir une gestion appropriée des ressources chargées à partir du classpath, il peut être nécessaire de surmonter les problèmes liés aux configurations de lancement et à l'enregistrement du gestionnaire au niveau JVM.
Comme alternative à l'enregistrement automatique du gestionnaire, il est possible de spécifier manuellement le gestionnaire lors de l'URL création :
new URL( null, "classpath:some/package/resource.extension", new org.my.protocols.classpath.Handler(ClassLoader.getSystemClassLoader()) );
Pour le chargement des ressources de chemin de classe à l'échelle de l'application, il est recommandé d'enregistrer une URLStreamHandlerFactory auprès de la JVM. Cela permet d'utiliser le gestionnaire personnalisé pour toutes les 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); } }
Pour enregistrer la fabrique, appelez URL.setURLStreamHandlerFactory() en passant la fabrique configurée.
En créant une fabrique de gestionnaires de flux et d'URLStreamHandler personnalisée, il est possible d'étendre les capacités de chargement de ressources de Java pour inclure des ressources situées sur le serveur de l'application. chemin de classe. Cela permet une plus grande flexibilité et simplifie le processus de chargement de ressources provenant de diverses sources.
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!