为了对此进行扩展,枚举classpath不是那么直截了当的主要原因是Java从未定义一种受支持的枚举方法。
系统类加载器,通常负责加载在java.class.path
系统属性上找到的依赖项,仅保证其类型为ClassLoader
,这是不可枚举的。
在Java 9之前,可以通过依赖实现细节来枚举系统类加载器:这通常返回一个URLClassLoader
,它有一个getURLs
方法。但这是一种未记录的行为。
从Java 9开始,系统类加载器实现被更改为一个不可枚举的内部类。
直接使用java.class.path
系统属性假定了一定的运行时行为,而不是检查实际行为的实际结果。这个假设在很多情况下是成立的,但在其他情况下则会失败。
理想的解决方案是一种可以枚举系统(以及可能平台)类加载器加载的资源的方法,这样就可以枚举整个classpath层次结构。
如果没有这样的方法,对于Java 9+,很可能需要依赖java.class.path
属性。如果这样做,次优解决方案应该至少适应以下两种特殊情况
- 应用程序可能在一个容器中运行,以及
- 动态类加载器可能在运行时添加资源。