对此稍作补充,列举classpath并不直接的原因是Java从未定义过一种支持的方式来做这件事。
系统类加载器,它通常加载在java.class.path
系统属性中找到的依赖,只能确保其类型为ClassLoader
,这不是可枚举的。
在Java 9之前,人们可以通过依赖实现细节来枚举系统类加载器:这通常会返回一个URLClassLoader
,该类具有getURLs
方法。然而,这是一个没有文档说明的行为。
从Java 9开始,系统类加载器的实现被更改为一个不可枚举的内部类。
直接使用java.class.path
系统属性是基于某些运行时行为,而不是检查实际行为的输出。这种假设在许多情况下都成立,但在其他情况下则失败。
理想的解决方案是,在Java 9+上能够枚举系统(和平台)类加载器加载的资源的一种方式,以便整个classpath层次都可以枚举。
如果没有这样的方案,在Java 9+上依赖java.class.path
属性可能是必要的。如果是这样做的话,下一个最好的方案应至少适应以下两种特殊情况:
- 应用程序可能在一个容器中运行。
- 动态类加载器可能会在运行时添加资源。