一.使用方法及示例
简介:当引入二方依赖包或三方依赖包时,可能出现外部依赖jar包与自己的工程需要依赖的冲突,或者多个二方三方依赖包互相冲突。这时候就需要一个隔离容器对他们进行隔离,其依赖的原理就是jvm认为不同classloader加载的类即使包名类名相同,也认为他们是不同的。sofa-ark将需要隔离的jar包打成plugin,对每个plugin都用独立的classloader去加载。
(温馨提示:若对sofa-ark不太了解的,最好先去看看官方文档,简单了解下)
使用的基本步骤:
- 在会发生冲突的jar包的POM文件加入sofa-ark提供的maven插件,将其打成特定格式的jar包(plugin)。
- 在外部工程按照约定引入jar包。如果外部工程想打包成可执行的jar(fat-jar),还需要加入特定的maven插件。
- 直接运行。
名词解释:
- Ark Container: Ark 容器,是组件 SOFAArk 的核心,运行 Ark 包时,Ark 容器会最先启动,负责应用运行时的管理,主要包括构建 Ark Plugin 和 Ark Biz 的类导入导出关系表、启动并初始化 Ark Plugin 和 Ark Biz、管理 Ark Plugin 服务的发布和引用等等。
- Biz:即业务工程,该工程引用一个或多个外部jar包。
- plugin:会发生冲突的外部依赖jar包经过提供的Maven插件打成的fat-jar包。运行时,由独立的类加载器加载,因此有隔离需求的 Jar 包建议打包成 Ark Plugin 供应用依赖。
1.0 sofa-ark原理
在sofa-ark中,使用container容器启动外部工程(Biz)和冲突jar包(plugin),sofa-ark的plugin maven插件将冲突的jar包打包成为plugin,外部工程只能引用plugin exported出来的类,并且这个类是由独立的PluginClassLoader
加载的,从而解决了jar包冲突的问题。
1.1 冲突示例
1.2 安装sofa-ark
从sofa-ark官网 将整个工程下载下来,在最外层pom.xml所在路径执行mvn package
和mvn install
将sofa-ark依赖jar包安装到本地。
1.3 创建基础依赖Jar包(冲突的包)
自己创建myjar工程,先后正常打包两个版本安装到本地maven仓库。
如:v1版本
v2版本
1.4 创建service包(plugin)
创建如图所示两个工程:
在myJarservice-v1
和myJarservice-v2
的pom中分别引用之前写的两个基础依赖jar包。然后在MyJarService1
和MyJarService2
中分别引用对应版本的myjar包里的方法。
如MyJarService1.java:
MyJarService2.java
注意:这里两个Service引用的是不同版本的myjar。
接下来需要对两个工程打包,和平常打包不一样的是需要加入sofa-ark-plugin的maven插件。两个工程下的pom.xml都要加入:
<build>
<plugins>
<plugin>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-ark-plugin-maven-plugin</artifactId>
<version>0.4.0-SNAPSHOT</version>
<executions>
<execution>
<id>default-cli</id>
<goals>
<goal>ark-plugin</goal>
</goals>
<configuration>
<!-- configure exported class -->
<exported>
<!-