In Java haben Entwickler Zugriff auf eine vielseitige API zum Laden von Ressourcen, die verschiedene URL-Protokolle verwendet. Während Protokolle wie „file://“ und „http://“ den Abruf von Ressourcen von bestimmten Speicherorten erleichtern, kann es jedoch erforderlich sein, auf Ressourcen über den Klassenpfad der Anwendung zuzugreifen, ohne explizit den JAR- oder Klassenordner anzugeben. In diesem Artikel wird eine Lösung für diese Anforderung untersucht, indem ein benutzerdefiniertes URL-Protokoll und ein Stream-Handler für das klassenpfadbasierte Laden von Ressourcen vorgestellt werden.
Im Mittelpunkt der Lösung steht ein URLStreamHandler, der geöffnet wird Verbindungen zur angegebenen URL. Dieser Handler muss bei der URL-Klasse unter Verwendung des „einfachen“ Paketnamens als unterstütztes Protokoll registriert werden.
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(); } }
Um Ressourcen mithilfe des benutzerdefinierten Protokolls zu laden, verwenden Sie das Folgende Syntax:
new URL("classpath:org/my/package/resource.extension").openConnection();
Durch die Angabe des Pfads relativ zum Klassenpfad wird es möglich, Ressourcen zu laden, ohne ihren spezifischen Speicherort innerhalb des Klassenpfads anzugeben Klassenpfad.
Um eine ordnungsgemäße Handhabung der aus dem Klassenpfad geladenen Ressourcen sicherzustellen, kann es erforderlich sein, Probleme mit Startkonfigurationen und der Handlerregistrierung auf JVM-Ebene zu beheben.
Als Alternative zur automatischen Handler-Registrierung ist es möglich, den Handler während der URL manuell anzugeben Erstellung:
new URL( null, "classpath:some/package/resource.extension", new org.my.protocols.classpath.Handler(ClassLoader.getSystemClassLoader()) );
Für das anwendungsweite Laden von Klassenpfadressourcen wird empfohlen, eine URLStreamHandlerFactory bei der JVM zu registrieren. Dadurch kann der benutzerdefinierte Handler für alle URLs verwendet werden:
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); } }
Um die Factory zu registrieren, rufen Sie URL.setURLStreamHandlerFactory() auf und übergeben Sie die konfigurierte Factory.
Durch die Erstellung einer benutzerdefinierten URLStreamHandler- und Stream-Handler-Factory ist es möglich, die Ressourcenladefunktionen von Java zu erweitern, um Ressourcen einzubeziehen, die sich im Klassenpfad der Anwendung befinden. Dies ermöglicht eine größere Flexibilität und vereinfacht das Laden von Ressourcen aus verschiedenen Quellen.
Das obige ist der detaillierte Inhalt vonWie kann ich die URL-Unterstützung von Java anpassen, um Ressourcen direkt aus dem Klassenpfad zu laden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!