Java中的独立类装入器是什么?

2022-09-04 21:13:45

在尝试解决此问题时,我遇到了一些文章等,这些文章提到了“孤立的”ClassLoaders。我无法通过Google搜索找到隔离类加载器的定义,所以也许这个术语不是广为人知的行话,也许在不同的上下文中有不同的含义。

无论如何,Maven的surefire插件可以使用一个独立的ClassLoader:http://maven.apache.org/plugins/maven-surefire-plugin/examples/class-loading.html

下面的答案之一还引用了一篇解释如何创建“隔离”类加载器的文章

上面的两个引用都没有给出隔离的类加载器的定义;他们似乎假设读者知道这意味着什么,或者可以查找它。但是,第二个链接确实包含有关“孤立”含义的提示:

通过引导,可以在不污染系统类路径的情况下运行容器。这允许您以未受污染的系统类路径作为其父级来运行已部署的应用程序。您已经实现了类装入器隔离。

但我不太清楚什么与本段或本文其余部分的内容以及如何隔离。我看到他正在加载一个没有覆盖/覆盖另一个版本的类的一个版本 - 也许一个类加载器与另一个类加载器隔离,因为没有一个是另一个的父级的不同实例?我不确定。

我特别渴望一个谷歌或SO搜索链接,其中包含一个明确包含答案的链接。指向答案的直接链接也有效。:)


答案 1

作者使用术语“隔离”基本上意味着JVM的引导类装入器(“主”类装入器)中没有任何额外的jar/类(只是一个简单的类,它反过来设置子类装入器)。这篇文章对于为什么这是“孤立的”并不明显,因为它只设置了一个子类加载器。当您设置多个子类装入器时,“隔离”一词变得更加明显。这些孩子将彼此隔离,因为他们不会共享任何类(除了核心JRE类)。因此,您可以执行一些操作,例如让每个孩子使用同一罐子的不同版本。


答案 2

下面介绍如何创建一个独立的类装入器,只要您需要一个未受污染的系统类路径,就可以创建一个,这对于引导Java程序很有用。


推荐