更新时间:2020-02-04 15:50
本样例工程演示了如何借助 maven
插件将一个普通的 Java 工程打包成标准格式规范的 Ark Plugin
。
现实开发中,常常会遇到依赖包冲突的情况。假设开发了一个类库 sample-lib
,业务应用在引入使用时,可能存在跟已有的依赖发生冲突的情况。通常这个时候,我们会希望自己的类库能够和业务其他依赖进行隔离,互不协商双方依赖包版本。 Ark Plugin
正是基于这种需求背景下的实践产物。Ark Plugin
运行在 Ark Container
之上,由容器负责加载启动,任何一个 Ark Plugin
由独立的 ClassLoader 加载,从而做到相互隔离。
Ark Plugin
存在四个概念:
有关插件规范的信息,详见 Ark Plugin > 插件规范。
官方提供了 Maven
插件,即 sofa-ark-plugin-maven-plugin
,只需要简单的配置项,即可将普通的 Java 工程打包成标准格式规范的 Ark Plugin
,插件坐标为:
<plugin>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-ark-plugin-maven-plugin</artifactId>
<version>${sofa.ark.version}</version>
</plugin>
有关插件配置的信息,详见 Ark Plugin > 配置模板。
基于该用例工程,下文将一步步描述如何构建一个 Ark Plugin
。
该用例工程是一个标准的 Maven 工程,一共包含两个模块:
com.alipay.sofa.ark.spi.service.PluginActivator
接口实现类和一个插件服务类,插件打包工具 sofa-ark-plugin-maven-plugin
即配置在该模块的 pom.xml
中。在 plugin 模块的 pom.xml
中按如下配置打包插件:
<build>
<plugins>
<plugin>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-ark-plugin-maven-plugin</artifactId>
<version>${project.version}</version>
<executions>
<execution>
<id>default-cli</id>
<goals>
<goal>ark-plugin</goal>
</goals>
<configuration>
<!--can only configure no more than one activator-->
<activator>com.alipay.sofa.ark.sample.activator.SamplePluginActivator</activator>
<!-- configure exported class -->
<exported>
<!-- configure package-level exported class-->
<packages>
<package>com.alipay.sofa.ark.sample.common</package>
</packages>
<!-- configure class-level exported class -->
<classes>
<class>com.alipay.sofa.ark.sample.facade.SamplePluginService</class>
</classes>
</exported>
<!--specify destination where ark-plugin will be saved, default saved to ${project.build.directory}-->
<outputDirectory>../target</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
示例工程中,虽只配置了一部分配置项,已经足够生成一个可用的 Ark Plugin
,各配置项含义如下:
activator
会执行一些初始化操作,比如发布插件服务。在本样例工程中,即发布了插件服务。mvn package
打包后,输出的 ark plugin 文件存放目录。在示例工程中,只导出了工程创建的类。实际在使用时,也可以把工程依赖的三方包也导出去。
和普通的工程操作类似,使用 mvn package
、mvn install
、mvn deploy
即可完成插件包的安装和发布。需要注意的是,默认发布的 Ark Plugin
其 Maven 坐标会增加 classifier=ark-plugin
。例如在该样例工程中,如果需要使用该 ark plugin,必须如下配置依赖:
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>sample-ark-plugin</artifactId>
<classifier>ark-plugin</classifier>
<version>${sofa.ark.version}</version>
</dependency>
在该示例工程中,演示了如何使用 PluginContext
发布插件服务:
public class SamplePluginActivator implements PluginActivator {
public void start(PluginContext context) throws ArkRuntimeException {
System.out.println("starting in sample ark plugin activator");
context.publishService(SamplePluginService.class, new SamplePluginServiceImpl());
}
public void stop(PluginContext context) throws ArkRuntimeException {
System.out.println("stopping in ark plugin activator");
}
}
同时,在服务实现 SamplePluginServiceImpl
中演示了如何引用其他插件或者Ark容器发的服务。这里是引用 Ark 容器发布的事件管理服务 EventAdminService
:
public class SamplePluginServiceImpl implements SamplePluginService {
@ArkInject
private EventAdminService eventAdminService;
public String service() {
return "I'm a sample plugin service published by ark-plugin";
}
public void sendEvent(ArkEvent arkEvent) {
eventAdminService.sendEvent(arkEvent);
}
}
在文档使用中是否遇到以下问题
更多建议
匿名提交