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.55k stars 488 forks source link

关于示例工程的一些疑问? #123

Closed dumbdonkey closed 5 years ago

dumbdonkey commented 5 years ago

Your question

您好,按照文档 https://github.com/alipay/sofa-ark/tree/master/sofa-ark-samples/sample-springboot-ark#%E5%BC%95%E5%85%A5-sample-ark-plugin 的说法,应该在工程中引入

<dependency>
     <groupId>com.alipay.sofa</groupId>
     <artifactId>sample-ark-plugin</artifactId>
     <classifier>ark-plugin</classifier>
     <version>0.5.1</version>
 </dependency>

但我发现样例工程的pom https://github.com/alipay/sofa-ark/blob/master/sofa-ark-samples/sample-springboot-ark/pom.xml 中并为添加classifier.

还有一个问题

在模块https://github.com/alipay/sofa-ark/blob/master/sofa-ark-samples/sample-ark-plugin/plugin/src/main/java/com/alipay/sofa/ark/sample/facade/SamplePluginService.java 中有一个SamplePluginService, 在sample-springboot-ark模块中无法直接new,不知道要如何使用这个服务呢?

多谢解答!

Your scenes

describe your use scenes (why need this feature)

Your advice

describe the advice or solution you'd like

Environment

QilongZhang commented 5 years ago

感谢关注,下面回答你提的两个问题;

classifier 并不是必须配置的,你发的文档链接中有强调说明。示例工程和readme不一样,应该是后面误删所致,现已PR修改。 image

dumbdonkey commented 5 years ago

感谢答复。不过我依然有些困惑...

文档 https://alipay.github.io/sofastack.github.io/docs/index.html 有提到sofa-ark的使用场景。

文档说说: 只需要把 A 和版本为 0.1 的 C 包一起打包成一个 Ark 插件,然后让应用工程引入该插件依赖即可; 但是你上面说 plugin发布的服务是给其他插件使用, 那么应用工程要怎么使用这个plugin提供的服务呢? (我在示例项目 sofa-ark-sample-springboot-ark 中也没发现引用plugin服务的地方)多谢解答

dumbdonkey commented 5 years ago

@QilongZhang 如上

QilongZhang commented 5 years ago

@Mobel123 插件发布的服务不是给biz使用的,也用不了。biz只能使用pugin导出的类。

dumbdonkey commented 5 years ago

@QilongZhang 确认下,我没理解错的话,sofa-ark-sample-springboot-ark 应该就是biz了,可是我在biz中无法new 任何plugin 导出的类 (ark-plugin 特有的打包格式,导致所有类都不可见了).

方便的话,能否提供一个示例(解决版本冲突的那种). 我尝试着编译了你的项目 https://github.com/QilongZhang/ark-plugin-demo.git 并集成到sofa-ark-sample-springboot-ark但是由于上面的原因,无法编译通过

再次感谢!

QilongZhang commented 5 years ago

你可以把相关的依赖引入进来,scope 设置成 provided. 示例可以参考这篇文章 https://zhuanlan.zhihu.com/p/36909393

dumbdonkey commented 5 years ago

@QilongZhang 多谢,终于跑通了...

我最近也在做一个基于classloader的隔离方案

大致方案如下:

  1. 使用者需要将接口和实现剥离到两个不同的模块中,
  2. 通过assembly插件将实现模块打成一个特殊包(通过设置特定目录隔离实现部分, 同时这里也将实现模块中的传递依赖全部去掉了)
  3. 使用方使用时,引入我提供的一个loader模块,接口模块和assembly后的模块,就可以进行加载了。

最近在几个项目中实践了下,暂时还没遇到什么坑, 您觉得这个方案怎么样? 谢谢