什么是Java中的隔离类加载器?

时间:2012-03-06 00:26:39

标签: java classloader

在尝试解决this problem时,我遇到了一些文章,等等,指的是“孤立的”ClassLoaders。我无法通过Google搜索找到 isolated classloader 的定义,所以这个术语可能不是广为人知的术语,也许在不同的上下文中有不同的含义。

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

下面的答案之一也是an article explaining how to create an "isolated" ClassLoader

上面的参考文献都没有给出一个孤立的ClassLoader的定义;他们似乎认为读者知道这意味着什么,或者可以查找它。但是,第二个链接确实包含了“隔离”含义的提示:

  

Bootstrapping允许您运行容器而不会污染系统类路径。这允许您使用未受污染的系统类路径作为其父级来运行已部署的应用程序。 您已经实现了类加载器隔离。

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

我特别贪图Google或SO搜索链接,其中包含一个清晰显示答案的链接。答案的直接链接也有效。 :)

4 个答案:

答案 0 :(得分:9)

作者使用术语“隔离”基本上是指JVM的引导类加载器(“主”类加载器)中没有任何额外的jar /类(只是一个简单的类,而后者又设置了它)子类加载器)。关于为什么这是“孤立”的文章并不是真正明显的,因为它只设置了一个子类加载器。当您设置多个子类加载器时,“隔离”术语会变得更加明显。这些孩子将彼此隔离,因为他们不会共享任何类(核心JRE类除外)。因此,您可以执行诸如让每个孩子使用相同jar的不同版本的事情。

答案 1 :(得分:2)

这里是how to create an isolated classloader,您可以在任何需要未受污染的系统类路径时创建一个,这对于引导Java程序非常有用。

答案 2 :(得分:1)

根据我对你链接的文章的理解,隔离的类加载器是一个与主系统类加载器分开的类加载器。也就是说,由隔离的类加载器加载的类将不可用于JRE中的每个类(只有隔离的类加载器自身加载的类[以及任何子类加载器加载的任何类])。

这可能很有用,因为您的两个依赖项可能需要运行同一个库的不同版本。也就是说,您的依赖项可能希望在库中看到同一类的不同实例。因此,给它们两个独立的隔离类加载器将允许它们加载它们所需的类而不会相互干扰。

答案 3 :(得分:0)

默认情况下,类加载器以系统类加载器为根形成一棵树。默认情况下,新的子类加载器将首先询问其父级是否可以加载该类,如果不能加载,则从其自己的源加载。

隔离类加载器的目的是通过先检查自己的源,然后是父SECOND,从而颠倒顺序,以使自己与父类加载器隔离。这允许您创建一个新的类加载上下文,在该上下文中您可以控制第一个外观。您仍然希望退回到父链,以便加载诸如jdk等之类的内容。

您还需要注意隔离的类加载器返回在父类加载器中定义的接口的实例,否则您将遇到LinkageErrors或其他问题。

这是我在2006年写的一篇文章,但是它仍然很有意义(关于资源加载,它是不完整的,而且api多年来已经发生了一些变化):

http://tech.puredanger.com/2006/11/09/classloader/