Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

宿主和插件对基础库依赖的疑惑 #429

Open
yghysdr opened this issue Oct 29, 2020 · 3 comments
Open

宿主和插件对基础库依赖的疑惑 #429

yghysdr opened this issue Oct 29, 2020 · 3 comments

Comments

@yghysdr
Copy link

@yghysdr yghysdr commented Oct 29, 2020

问题一:
我们有一些基础功能的封装,在宿主和插件都用到了,宿主工程肯定用的implementation依赖,请问插件是通过 compileOnly,然后配置白名单还是通过来implementation的依赖呢,有什么建议。我理解的是implementation依赖会导致插件包体积变大,使用 compileOnly更好一些,但是经常出现如下错误。
java.lang.VerifyError: Verifier rejected class

问题二:
application的classload和插件application的classload不是一个,如果插件和宿主同时依赖了一个单例,由于classload的不同造成
单例创建了两个,如果插件通过白名单依赖,此时单例是一个,但是该单例的classload是宿主的,在该单例中遇到CLass.forName无法创建插件的类,虽然通过指定使用插件的classload可以解决,但是不知道还有其他什么潜在问题吗

现在想法是插件宿主尽可能独立,少使用白名单,尽可能保持插件的完全独立运行,忽略插件的大小这样对吗

想问作者对插件和宿主依赖同一个库有什么建议吗, 谢谢

@shifujun
Copy link
Collaborator

@shifujun shifujun commented Oct 29, 2020

Shadow设计时考虑的场景主要是宿主和插件的版本是多对多关系的。所以插件compileOnly依赖宿主中的实现,可能会因为实现有变化而不能兼容旧版本。因此”问题一“的这种场景,我们是需要宿主和插件约定一个不变的接口,放到白名单里,来实现插件复用宿主能力的。可以参考:https://github.com/Tencent/Shadow/tree/master/projects/sample/source/sample-host-lib/src/main/java/com/tencent/shadow/sample/host/lib

VerifyError一般是因为传递依赖的一些类型由于多个ClassLoader的关系出现了不匹配的情况。所以我们在”多对多“版本场景下,不应该在白名单里声明任何有实现的类型,只声明一些空实现的接口才安全。

你的”问题二“和”问题一“是一样的。可能你需要再回顾一下ClassLoader的知识了。你的目的没问题,插件完全独立运行的构建中,可以将本来依赖宿主实现的接口在本地也打包一个实现即可。

以上谈到的东西其实跟Shadow都没有关系,都是Java的ClassLoader基本的东西。

@yghysdr
Copy link
Author

@yghysdr yghysdr commented Oct 29, 2020

感谢!
1 白名单目的是复用宿主能力,并且尽可能是约定接口规避兼容问题。
2 我原来是把基础库(例如http)都配置到白名单,达到缩小插件的大小,方向是错误(兼容问题,compileOnly不彻底等问题)。
这样理解是这正确的吧。

@shifujun
Copy link
Collaborator

@shifujun shifujun commented Oct 30, 2020

是对的。

如果还是遇到困难,最好就是通过PR向Shadow的sample 补充你需要的场景。遇到解决不了的问题,方便交流,也方便合作解决。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
2 participants
You can’t perform that action at this time.