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

【bug】独立运行正常,集成到主应用后日志包冲突,排查起来非常麻烦,有没有好的方案隔离。 #637

Closed zyclove closed 1 year ago

zyclove commented 1 year ago

Describe the bug

biz应用本地独立运行正常,业务模块已增加日志包不打包,排除了日志相关依赖包。

ch.qos.logback
                            <excludeGroupId>org.apache.logging.log4j</excludeGroupId>
                            <excludeGroupId>org.slf4j</excludeGroupId>

主应用集成启动时候报错,排查起来非常麻烦。

java.lang.RuntimeException: Meet exception when deploying biz after embed master biz started! at com.alipay.sofa.ark.support.startup.EmbedSofaArkBootstrap.deployStaticBizAfterEmbedMasterBizStarted(EmbedSofaArkBootstrap.java:106) ~[sofa-ark-support-starter-2.1.3.jar:?] at com.alipay.sofa.ark.springboot.listener.ArkDeployStaticBizListener.onApplicationEvent(ArkDeployStaticBizListener.java:38) ~[sofa-ark-springboot-starter-2.1.3.jar:?] at com.alipay.sofa.ark.springboot.listener.ArkDeployStaticBizListener.onApplicationEvent(ArkDeployStaticBizListener.java:26) ~[sofa-ark-springboot-starter-2.1.3.jar:?] at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.10.jar:2.4.10] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771) ~[spring-boot-2.4.10.jar:2.4.10] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763) [spring-boot-2.4.10.jar:2.4.10] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438) [spring-boot-2.4.10.jar:2.4.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) [spring-boot-2.4.10.jar:2.4.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) [spring-boot-2.4.10.jar:2.4.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1318) [spring-boot-2.4.10.jar:2.4.10] at com.tuya.volcano.fat.starter.Application.main(Application.java:42) [classes/:?] Caused by: java.lang.reflect.InvocationTargetException at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?] at com.alipay.sofa.ark.support.startup.EmbedSofaArkBootstrap.deployStaticBizAfterEmbedMasterBizStarted(EmbedSofaArkBootstrap.java:103) ~[sofa-ark-support-starter-2.1.3.jar:?] ... 17 more Caused by: com.alipay.sofa.ark.exception.ArkRuntimeException: java.lang.LinkageError: loader constraint violation: when resolving method 'org.slf4j.ILoggerFactory org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()' the class loader com.alipay.sofa.ark.container.service.classloader.BizClassLoader @63c6579 of the current class, org/slf4j/LoggerFactory, and the class loader 'app' for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature (org.slf4j.LoggerFactory is in unnamed module of loader com.alipay.sofa.ark.container.service.classloader.BizClassLoader @63c6579, parent loader 'bootstrap'; org.slf4j.impl.StaticLoggerBinder is in unnamed module of loader 'app') at com.alipay.sofa.ark.container.service.biz.DefaultBizDeployer.deploy(DefaultBizDeployer.java:61) ~[sofa-ark-container-2.1.3.jar:?] at com.alipay.sofa.ark.container.service.biz.BizDeployServiceImpl.deploy(BizDeployServiceImpl.java:55) ~[sofa-ark-container-2.1.3.jar:?] at com.alipay.sofa.ark.container.pipeline.DeployBizStage.processStaticBiz(DeployBizStage.java:56) ~[sofa-ark-container-2.1.3.jar:?] at com.alipay.sofa.ark.container.ArkContainer.deployBizAfterMasterBizReady(ArkContainer.java:168) ~[sofa-ark-container-2.1.3.jar:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?] at com.alipay.sofa.ark.support.startup.EmbedSofaArkBootstrap.deployStaticBizAfterEmbedMasterBizStarted(EmbedSofaArkBootstrap.java:103) ~[sofa-ark-support-starter-2.1.3.jar:?] ... 17 more Caused by: java.lang.LinkageError: loader constraint violation: when resolving method 'org.slf4j.ILoggerFactory org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()' the class loader com.alipay.sofa.ark.container.service.classloader.BizClassLoader @63c6579 of the current class, org/slf4j/LoggerFactory, and the class loader 'app' for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature (org.slf4j.LoggerFactory is in unnamed module of loader com.alipay.sofa.ark.container.service.classloader.BizClassLoader @63c6579, parent loader 'bootstrap'; org.slf4j.impl.StaticLoggerBinder is in unnamed module of loader 'app') at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:423) ~[slf4j-api-1.7.25.jar:1.7.25] at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362) ~[slf4j-api-1.7.25.jar:1.7.25] at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:388) ~[slf4j-api-1.7.25.jar:1.7.25] at com.volcano.eyes.starter.VolcanoEyesStarterApplication.(VolcanoEyesStarterApplication.java:23) ~[volcano-eyes-starter-2.0.0-20230329.015025-8-ark-biz.jar:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?] at com.alipay.sofa.ark.bootstrap.MainMethodRunner.run(MainMethodRunner.java:48) ~[sofa-ark-archive-2.1.3.jar:?] at com.alipay.sofa.ark.container.model.BizModel.start(BizModel.java:285) ~[sofa-ark-container-2.1.3.jar:?] at com.alipay.sofa.ark.container.service.biz.DefaultBizDeployer.deploy(DefaultBizDeployer.java:57) ~[sofa-ark-container-2.1.3.jar:?] at com.alipay.sofa.ark.container.service.biz.BizDeployServiceImpl.deploy(BizDeployServiceImpl.java:55) ~[sofa-ark-container-2.1.3.jar:?] at com.alipay.sofa.ark.container.pipeline.DeployBizStage.processStaticBiz(DeployBizStage.java:56) ~[sofa-ark-container-2.1.3.jar:?] at com.alipay.sofa.ark.container.ArkContainer.deployBizAfterMasterBizReady(ArkContainer.java:168) ~[sofa-ark-container-2.1.3.jar:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?] at com.alipay.sofa.ark.support.startup.EmbedSofaArkBootstrap.deployStaticBizAfterEmbedMasterBizStarted(EmbedSofaArkBootstrap.java:103) ~[sofa-ark-support-starter-2.1.3.jar:?] ... 17 more

Expected behavior

希望包依赖可以隔离

Actual behavior

biz应用包影响主应用启动

Steps to reproduce

Minimal yet complete reproducer code (or GitHub URL to code)

Environment

lylingzhen commented 1 year ago

@zyclove 解压看一下模块打出来的 jar 包,是否包含了日志相关的类,看上去没有排干净?

zyclove commented 1 year ago
image image

@lylingzhen 麻烦有空帮忙分析一下,谢谢。

zyclove commented 1 year ago

不过看了一下biz模块 MANIFEST.MF 里面declared-libraries是有包括log相关依赖的。

Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven 3.6.3 Built-By: docker Build-Jdk: 11.0.12 Main-Class: com.tuya.volcano.eyes.starter.VolcanoEyesStarterApplication Ark-Biz-Name: volcano-eyes Ark-Biz-Version: 2.0.0-SNAPSHOT priority: 1000 web-context-path: /volcano-eyes deny-import-packages: deny-import-classes: deny-import-resources: inject-plugin-dependencies: inject-export-packages: declared-libraries: ..... spring-core,metrics-core,jackson-datatype- jdk8,basic-common,resilience4j-core,log4j-over-slf4j,log4j-api,sqlline,j2objc-a nnotations,basic-client,volcano-sso,reactor-core,twill-discovery-core,j ackson-xc,tomcat-annotations-api,hutool-cache,kerb-client,kerb-simplekd

lvjing2 commented 1 year ago

declared-libraries 表示的是,模块里声明过的依赖,与是否provided无关。这里能看到这些依赖,说明这些依赖没有去除掉,需要把对应依赖 exclude 掉才行。

zyclove commented 1 year ago

这些

image

sofa-ark-maven-plugin打包配置已经都添加execlude的呢。

lvjing2 commented 1 year ago

不建议使用这里的 exclude 能力,一个是 declared-libraries 目前不支持,因为从这里直接exclude的有可能是要委托给基座的,有可能是不需要委托给基座的,无法判断,所以不建议使用 exclude 能力。另一个是这里 exclude 不能排除不同 groupId 的建议依赖。

lylingzhen commented 1 year ago

这个问题先 Close?cc @lvjing2 有问题再 Reopen。