2019-03-13 · Develop

SpringBoot2.x 集成 Activiti6.0

Activiti 是业界领先的轻量级的 BPMN 开源引擎,实现真正的流程自动化。下面介绍如何在 springboot2.0.6环境下集成 activiti6.0.0

第一步添加依赖,除开数据源等外, activiti 需要如下的两个依赖。

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter-basic</artifactId>
    <version>6.0.0</version>
</dependency>
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter-actuator</artifactId>
    <version>6.0.0</version>
</dependency>

activiti 默认在 resources/processes 目录下加载流程文件,所以这里创建 processes 目录并添加测试用流程文件 process.bpmn20.xml

默认目录可以通过 spring.activiti.process-definition-location-prefix 配置来修改,默认的流程文件格式为 *.bpmn20.xml 和 *.bpmn 文件可以通过 spring.activiti.process-definition-location-suffixes 来进行自定义。

启动项目将会包如下的错误

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1762)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)

这是应为 6.0.0 版本的 starter-basic 使用的是 springboot-1.2.6 而 springboot 从 1.x 到 2.x 是一个大版本升级,有很多的 api 和 spi 进行了修改,所以并不兼容。解决方案有下面几种

1. 降低 springboot 版本

将 springboot 版本降到 1.2.6 这样不能使用 springboot 2.x 的一些特性肯定是得不偿失的,首先排除。

2. 升级 activiti 版本

将依赖activiti-spring-boot-starter-basic 换成 activiti-spring-boot-starter 这样是最好的解决方案。前提是能解决 activiti 升级的兼容问题,应为这样会升级 activiti 的版本到 7.x 而 7.x 还在 bate 阶段。

3. 排除掉 SecurityAutoConfiguration 的自动装配

排除掉 SecurityAutoConfiguration 的自动装配是网络上比较多的一种实现方式,实现起来很简单,但是这样会损失一些功能。代码如下,

import org.activiti.spring.boot.SecurityAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class AvtivitiApplication {

    public static void main(String[] args) {
        SpringApplication.run(AvtivitiApplication.class, args);
    }

}

4. 更改源码适配 springboot2.x

更改源码是技术难道相对最高的,而且修改源码有风险。解决思路就是参考 7 版本的代码去修改 6 的代码。

首先 fork 代码https://github.com/Activiti/Activiti 到自己的仓库并 clone 到本地仓库。
然后将 activiti-6.0.0 和 v7.0.1 两个 tag checkout 到分支上,应为 v7.0.1使用的是 springboot 2.0.4 的版本,对照着修改要容易的多

git checkout -b activiti-6.0.0-boot2.0.6 activiti-6.0.0

通过查看根 pom 文件知道,springboot 模块在发行版(distro)环境中,所以我们先修改统一修改项目的版本

mvn versions:set -DnewVersion=6.0.0-boot2.0.6 -Pdistro

然后将 modules/activiti-spring-boot/pom.xml 文件中的 springboot 版本修改为 2.0.6

activiti-spring-boot-pom

现在我们进行安装到本地仓库

mvn clean install source:jar -Dmaven.test.skip=true -Pdistro

出现错误的类就是我们升级版本需要修改的文件

DataSourceProcessEngineAutoConfiguration.java 这个就没啥了 name 更名为 value

DataSourceProcessEngineAutoConfiguration

下面是三个和监控信息有关的类,修改主要是 springboot 将继承改为了注解的方式所引发的问题

ProcessEngineEndpoint.java

ProcessEngineEndpoint

ProcessEngineMvcEndpoint.java

ProcessEngineMvcEndpoint

EndpointAutoConfiguration.java

EndpointAutoConfiguration

然后就是 SecurityAutoConfiguration.java 这个文件是 SecurityAutoConfiguration 类改了类路径,也是第三中方案为啥不进行自动装配的原因,毕竟找不到类了嘛
SecurityAutoConfiguration

代码需要修改的到这里就修改完了,再次发布后就可以在 springboot2 中使用 activiti6.0 了

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter-basic</artifactId>
    <version>6.0.0-boot2.0.6</version>
</dependency>

并且我们开启并访问监控地址 http://localhost:8080/actuator/activiti

activiti-actuator