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

apo*_*217 10 java classloader

当试图解决这个问题时,我遇到了一些文章等,指的是"孤立的"ClassLoaders.我无法通过谷歌搜索找到孤立的类加载器的定义,所以也许该术语不是广为人知的术语,并且可能在不同的上下文中具有不同的含义.

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

下面的答案之一还引用了一篇文章,解释了如何创建"隔离的"ClassLoader.

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

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

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

我特别贪图Google或SO搜索链接,其中包含一个明确地回答的链接.答案的直接链接也有效.:)

jta*_*orn 10

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

  • @ apollodude217-是的,这是正确的。但是,关键的一点是,oneUrl和anotherUrl都不应引用由父类加载器加载的类(因此,该示例在运行主类加载器时没有多余的jar)。 (2认同)