Tomcat7下使用带classpath的URL通过系统类加载器获取资源返回null
问题根因
- 类加载器选择错误:
ClassLoader.getSystemClassLoader()是JVM的系统类加载器,仅负责加载JDK核心类、Tomcat基础组件类,Web应用WEB-INF/classes、WEB-INF/lib下的私有资源仅对当前Web应用的上下文类加载器可见,系统类加载器无法访问该路径下的资源,因此返回null。 - 资源路径格式错误:类加载器的
getResource()方法接收的是相对于classpath根的路径,不允许以斜杠/开头,你从classpath协议URL中解析出的路径自带开头斜杠,会导致资源匹配失败。 - 自定义URL协议风险:JDK默认没有内置
classpath协议的URL处理器,直接构造new URL("classpath:/xxx")在无自定义协议处理器的环境下会直接抛出MalformedURLException,属于不规范写法。
修复后代码
// 获取Tomcat分配给当前Web应用的上下文类加载器 ClassLoader webAppClassLoader = Thread.currentThread().getContextClassLoader(); // 传入相对于classpath根的无首斜杠路径 final URL resourceUrl = webAppClassLoader.getResource("conf/plugins/my_app_conf.txt"); if (resourceUrl == null) { // 自行补充资源不存在的异常处理逻辑 throw new IllegalArgumentException("配置文件不存在:conf/plugins/my_app_conf.txt"); } URLConnection urlc = resourceUrl.openConnection(); // 可直接将resourceUrl传入仅接受URL参数的第三方应用
内容的提问来源于stack exchange,提问作者user63898
相关产品推荐
相关产品推荐

