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

非嵌入模式执行启动 SofaArkBootstrap报unreachable invocation. #958

Closed shichaoyuan closed 2 months ago

shichaoyuan commented 2 months ago

Describe the question or bug

public class Main {
    public static void main(String[] args) throws Throwable {
        SofaArkBootstrap.launch(args);
        System.out.println("Main classloader: " + Main.class.getClassLoader());
    }
}

这样直接启动 ark container 报

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: An exception occurred while running. null
    at com.alipay.sofa.ark.support.startup.SofaArkBootstrap.launch(SofaArkBootstrap.java:60)
    at org.example.ark.Main.main(Main.java:8)
Caused by: java.lang.RuntimeException: An exception occurred while running. null
    at com.alipay.sofa.ark.support.thread.IsolatedThreadGroup.rethrowUncaughtException(IsolatedThreadGroup.java:50)
    at com.alipay.sofa.ark.support.startup.SofaArkBootstrap.launch(SofaArkBootstrap.java:56)
    ... 1 more
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at com.alipay.sofa.ark.support.thread.LaunchRunner.run(LaunchRunner.java:61)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at com.alipay.sofa.ark.bootstrap.MainMethodRunner.run(MainMethodRunner.java:55)
    at com.alipay.sofa.ark.bootstrap.AbstractLauncher.launch(AbstractLauncher.java:105)
    at com.alipay.sofa.ark.bootstrap.AbstractLauncher.launch(AbstractLauncher.java:74)
    at com.alipay.sofa.ark.support.startup.SofaArkBootstrap.remain(SofaArkBootstrap.java:78)
    ... 6 more
Caused by: com.alipay.sofa.ark.exception.ArkRuntimeException: com.alipay.sofa.ark.exception.ArkRuntimeException: unreachable invocation.
    at com.alipay.sofa.ark.container.pipeline.StandardPipeline.process(StandardPipeline.java:83)
    at com.alipay.sofa.ark.container.ArkContainer.start(ArkContainer.java:157)
    at com.alipay.sofa.ark.container.ArkContainer.main(ArkContainer.java:118)
    ... 14 more
Caused by: com.alipay.sofa.ark.exception.ArkRuntimeException: unreachable invocation.
    at com.alipay.sofa.ark.container.pipeline.HandleArchiveStage.process(HandleArchiveStage.java:164)
    at com.alipay.sofa.ark.container.pipeline.StandardPipeline.process(StandardPipeline.java:75)
    ... 16 more
Caused by: java.lang.RuntimeException: unreachable invocation.
    at com.alipay.sofa.ark.loader.DirectoryBizArchive.getUrl(DirectoryBizArchive.java:100)
    at com.alipay.sofa.ark.container.service.biz.BizFactoryServiceImpl.createBiz(BizFactoryServiceImpl.java:92)
    at com.alipay.sofa.ark.container.pipeline.HandleArchiveStage.process(HandleArchiveStage.java:90)
    ... 17 more

抛异常的位置在:

https://github.com/sofastack/sofa-ark/blob/a3e93f2cd1e758d0eed6d101a69e3bfe12b82dfb/sofa-ark-parent/core-impl/container/src/main/java/com/alipay/sofa/ark/container/service/biz/BizFactoryServiceImpl.java#L93

此时 master biz 是 DirectoryBizArchive,也就是支持从IDE启动的。

Expected behavior

这种情况是否应该处理一下?要不在IDE里就无法启动了

Environment

lvjing2 commented 2 months ago

如果方便处理的话,可以直接提个 PR 来解决下哈。另外我们建议使用嵌入的方式启动

shichaoyuan commented 2 months ago

如果方便处理的话,可以直接提个 PR 来解决下哈。另外我们建议使用嵌入的方式启动

其实没太理解嵌入与非嵌入的区别。 「嵌入模式」启动后又回到 appClassLoader,而「非嵌入模式」启动后还是bizClassLoader,除此之外还有其他区别么?

lvjing2 commented 2 months ago

是的,秉持着尽可能少的侵入应用的运行模式,通过嵌入模式我们让基座启动后还是 appClassLoader。