sofastack / sofa-ark

SOFAArk is a light-weight,java based classloader isolation framework.
https://www.sofastack.tech/projects/sofa-boot/sofa-ark-readme/
Apache License 2.0
1.56k stars 497 forks source link

Some questions about ContainerClassLoader #338

Closed masteryourself closed 4 years ago

masteryourself commented 4 years ago

Your question

createContainerClassLoader 方法在创建 ContainerClassLoader 时传入的 父CL 是 null,这样做有什么好处?

ContainerClassLoader 加载了 SOFA-ARK/container 里的 jar 包,假如说我在这个包里用了一个 /jar/lib/ext 下的一个 class,难道不会报错吗?

Your scenes

com.alipay.sofa.ark.bootstrap.AbstractLauncher#createContainerClassLoader(com.alipay.sofa.ark.spi.archive.ContainerArchive)

Environment

sofastack-bot[bot] commented 4 years ago

Hi @masteryourself, we detect non-English characters in the issue. This comment is an auto translation by @sofastack-robot to help other users to understand this issue.

We encourage you to describe your issue in English which is more friendly to other users.

Your question createContainerClassLoader The parent CL passed in when creating a ContainerClassLoader is null. What's the benefit of doing so? ContainerClassLoader loads the jar package in SOFA-ARK / container. If I used a class under / jar / lib / ext in this package, wouldn't it report an error? ### Your scenes com.alipay.sofa.ark.bootstrap.AbstractLauncher # createContainerClassLoader (com.alipay.sofa.ark.spi.archive.ContainerArchive) ### Environment-SOFAArk version: 1.0.0

glmapper commented 4 years ago

ContainerClassLoader 加载了 SOFA-ARK/container 里的 jar 包,假如说我在这个包里用了一个 /jar/lib/ext 下的一个 class,难道不会报错吗?

你这里说的报错是指什么?是找不到类还是找不到 ClassLoader? ContainerClassLoader 作为 URLClassLoader 的子类, ContainerClassLoader 加载类的过程是直接委托给父类(java.lang.ClassLoader) 来处理的。在 java 的双亲委派模型中,会优先将类交给父类加载,父类加载不到的情况下再由子类 load。ContainerClassLoader 虽然执行 parent 为 null,但是也不会影响加载的

masteryourself commented 4 years ago

这里的报错是指找不到类。ContainerClassLoader 确实是首先委托给 parent 加载,这里在构造 ContainerClassLoader 的时候传的是 null,所以父 CL 可以理解是 BootstrapCL,显然 BootstrapCL 是没有能力加载 /jar/lib/ext 目录下的类,ContainerClassLoader 显然也没有能力加载啊(构造时候指定的 urls 只有 SOFA-ARK/container 下的 lib)

 protected ClassLoader createContainerClassLoader(ContainerArchive containerArchive)
                                                                                       throws Exception {
        List<URL> classpath = getExecutableArchive().getConfClasspath();
        classpath.addAll(Arrays.asList(containerArchive.getUrls()));
        return createContainerClassLoader(classpath.toArray(new URL[] {}), null);
    }
glmapper commented 4 years ago

@masteryourself 理解你的问题了,ContainerClassLoader 目前作为 Ark 容器自身的 classloader,ContainerClassLoader 本身并不支持加载 /jar/lib/ext 目录下的类,这部分类在 sofa ark 中没有被特殊处理。

另外问下,你们是在什么场景下对此有需求吗?

masteryourself commented 4 years ago

需求目前还木有,疑问是有的 image 这个图是 SOFA-ARK/container 里的 fat-jar 包,里面显然用到了一些三方技术如 guava、log,你们是如何确定这些 jar 包不会去引用 /jar/lib/ext 目录下的类,主要疑问也是在此处,不知道这里的父 CL 传不传到底有何益弊?可以简单说一下这个优缺点吗

glmapper commented 4 years ago

这个图是 SOFA-ARK/container 里的 fat-jar 包,里面显然用到了一些三方技术如 guava、log,你们是如何确定这些 jar 包不会去引用 /jar/lib/ext 目录下的类,主要疑问也是在此处,不知道这里的父 CL 传不传到底有何益弊?可以简单说一下这个优缺点吗

目前 ark 容器所使用的包是 ark 自己管控的,不会用到 /jar/lib/ext 的类;另外 ContainerClassLoader 并不会去处理业务或者中间件层面的类,所以从设计上就没有使用 ext 作为父 classloader。当前的考虑是 ContainerClassLoader 不需要有复杂的继承关系,这块由 ark Container 容器自身的能力决定(简单)。

masteryourself commented 4 years ago

thank you