[google/guava]在 OpenJDK 10 下运行时,ClassPath 返回空 ClassInfo

2024-04-24 604 views
5

以下测试在 JDK 8 下成功,但在 OpenJDK 10 下失败。

JDK 10 是否需要使用不同的类加载器来允许我遍历类路径?

class ExamplesTest {
    companion object {
        private val currentPackage = ExamplesTest::class.java.`package`.name
    }

    fun `examples test`() {
        val allTopLevelClasses =
            ClassPath
                .from(Thread.currentThread().contextClassLoader)
                .getTopLevelClasses(currentPackage)
        assertThat("Should not be empty", allTopLevelClasses, !isEmpty)
    }
}
java --version

openjdk 10.0.2 2018-07-17
OpenJDK Runtime Environment 18.3 (build 10.0.2+13)
OpenJDK 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)

回答

7

文档推荐ClassLoader getSystemClassLoader​().那样有用吗?

4

也存在同样的问题ClassLoader.getSystemClassLoader​()

2

我认为这个问题背后的原因是ClassLoader.getSystemClassLoader​()不再返回UrlClassloaderJDK 10 下的 a。

6

您使用什么版本的番石榴?我们的测试在 Java 10 下ClassPath通过ClassLoader.getSystemClassLoader()了,但这只是因为我们在23.1中所做的更改。

8

版本26.0。没关系,似乎 gradle 出于22.0某种原因已将我们的 Guava 版本降级为版本,我需要对此进行调查。

8

这是我自己的错误。对不起。更新版本26.0-jre修复了该问题。谢谢!

9

谢谢。也就是说,我一直在调试,并且看到了奇怪的东西。

  • 看起来 Kotlin 类调用返回的对象与Guava 的??ClassLoader.getSystemClassLoader()调用返回的对象不同。ClassLoader.getSystemClassLoader()ClassPath

  • 正如您所注意到的,当我从 Java 8 转到 Java 10 时,从 Kotlin 调用返回的 1 从 a 变为URLClassLoader不是 1。但是我从 Java 8 加载器获得的 URL 列表仅包含来自 JDK 的一些 URL,而不包含来自 Kotlin 的任何 URL,因此我在 Java 8 下的测试也失败了。 (如果我使用 ,它也会失败Thread.currentThread().contextClassLoader。)即使我编辑ClassPath以强制它使用java.class.path(Java 10 /非URLClassLoader行为),这也没有帮助,因为java.class.path只包含 Kotlin 运行时。或者也许我一路上把其中的一些事情搞混了;我不会感到惊讶。

也许我所看到的和您所看到的之间的差异与我们运行测试的方式有关。但我很容易想象这里的问题仍然存在。如果您遇到其他情况,请告诉我们。

8

@cpiotr 感谢您对此进行深入研究,如果我发现其他奇怪的情况,我将提出一个新问题。