首页 > 解决方案 > 迁移到 java11 ClassCastException

问题描述

我有一个曾经在我的 java 程序中使用的库。

它包含下一行:

URLClassLoader cl = (URLClassLoader) ClassLoader.getSystemClassLoader();

它在 java8 上工作正常,但是在我尝试在 java11 上启动它之后,我得到了 ClassCastException

java.lang.ClassCastException:类 jdk.internal.loader.ClassLoaders$AppClassLoader 不能转换为类 java.net.URLClassLoader

是否可以在不修改库的情况下解决此问题?AFAIK,Java 应该是向后兼容的,所以也许一些命令行参数可能会有所帮助?

谢谢

标签: javajava-8migrationjava-11

解决方案


Java 是向后兼容的。ClassLoader.getSystemClassLoader()在 Java 8中查看表明它返回的是ClassLoader-instance,而不是URLClassLoader-instance。ClassLoader.getSystemClassLoader()在 Java 11 中也是如此。因此,从来没有任何保证会ClassLoader.getSystemClassLoader()返回URLClassLoader.


据我所知,没有办法将 a 转换为ClassLoadera URLClassLoader。解决此问题的唯一正确方法是编写库的维护人员并告诉他们他们依赖于一些实现细节,他们不应该这样做并要求他们解决问题。如果这是一个简单的修复并且项目是开源的,您可以分叉项目,修复问题并创建拉取请求。


推荐阅读