In Java, resources can be loaded using various URL protocols, enabling separation between resource loading and the application using it. A URL is represented as a simple string, making resource loading highly configurable.
Is there a protocol to load resources using the current classloader? This is similar to the Jar protocol, but without specifying a specific jar or class folder.
This can be achieved using a custom URLStreamHandler, which opens a connection to a given URL. The Handler is named simply as "Handler," allowing automatic pickup when specified using java -Djava.protocol.handler.pkgs=org.my.protocols.
Basic Implementation:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Usage:
1 |
|
Manual Code Handler Specification:
If the code is controlled, the handler can be specified manually:
1 |
|
JVM Handler Registration:
The most comprehensive solution is to register a URLStreamHandlerFactory that handles all URLs across the JVM:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Then call URL.setURLStreamHandlerFactory() with the configured factory to register the handler.
JVM Handler Registration Issue:
This method can only be called once per JVM, and Tomcat may attempt to register its JNDI handler. Using Jetty or a custom URLStreamHandlerFactory with a ThreadLocal approach is recommended.
License:
The solution is released to the public domain, with a request to start an OSS project for modifications.
The above is the detailed content of How to Load Resources from the Classpath Using a Custom URL Protocol in Java?. For more information, please follow other related articles on the PHP Chinese website!