首页 >Java >java教程 >如何在 Java 中使用自定义 URL 协议从类路径加载资源?

如何在 Java 中使用自定义 URL 协议从类路径加载资源?

Susan Sarandon
Susan Sarandon原创
2024-11-18 02:56:02459浏览

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

Java 中从类路径加载资源的 URL

在 Java 中,可以使用各种 URL 协议加载资源,从而实现资源加载和使用它的应用程序之间的分离。 URL 表示为简单的字符串,使得资源加载高度可配置。

问题陈述

是否有使用当前类加载器加载资源的协议?这与 Jar 协议类似,但无需指定特定的 jar 或类文件夹。

解决方案

这可以使用自定义 URLStreamHandler 来实现,它打开到给定 URL 的连接。 Handler 简单地命名为“Handler”,允许在使用 java -Djava.protocol.handler.pkgs=org.my.protocols.

Basic 指定时自动拾取实现:

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

用法:

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

其他注意事项:

手动代码处理程序规范:

如果代码受控制,处理程序可以手动指定:

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

JVM Handler 注册:

最全面的解决方案是注册一个 URLStreamHandlerFactory 来处理跨 JVM 的所有 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);
    }
}

然后使用配置好的工厂调用 URL.setURLStreamHandlerFactory() 来注册handler.

JVM 处理程序注册问题:

每个 JVM 只能调用此方法一次,Tomcat 可能会尝试注册其 JNDI 处理程序。建议使用 Jetty 或自定义 URLStreamHandlerFactory 与 ThreadLocal 方法。

许可证:

该解决方案已发布到公共领域,并请求启动 OSS 项目用于修改。

以上是如何在 Java 中使用自定义 URL 协议从类路径加载资源?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn