随便一说
因为需要搭建公司新的框架,使用了SpringBoot+MyBatis,加入了MyBatis的通用Mapper、分布插件PageHelper、MyBatis Generator,因为后面做的项目需要用到工作流,所以又需要把工作流(选用了Activiti)加进来。在没有加入Activiti之前,框架搭建的还算比较顺利,包括加入thymeleaf、lombok、swagger等,虽然遇到了问题,但解决起来都算比较顺利。但是,加入了工作流,则是遇到了大麻烦!!!
开发环境
这里假设已经有了一个框架,是由SpringBoot+MyBatis+druid+lombok+swagger+thymeleaf(这些集成会在后续的文章中进行说明),在这个框架的基础上集成Activiti。下面对开发环境及框架版本等信息进行说明:
- 开发工具:IDEA 2017.2
- JDK:1.8
- mysql:5.1.44
- SpringBoot:2.0.1
- MyBatis:3.4.5(Mapper:3.4.4,PageHelper:5.1.2,Generator对应的Maven插件:1.3.5)
- druid:1.0.19
- thymeleaf:同SpringBoot一致为2.0.1
- swagger:2.2.2
- lombok:1.16.8
- Activiti:5.22.0
集成Activiti
集成中遇到的问题,在文章的后面会给出解释说明,这里先说明怎么集成工作流。
- 添加Activiti的依赖;
- 生成Activiti的25张表。
添加依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.woxin.itsm</groupId> <artifactId>itsm</artifactId> <version>0.0.1-SNAPSHOT</version> <!--<packaging>jar</packaging>--> <packaging>war</packaging> <name>itsm</name> <description>itsm project</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <activiti.version>5.22.0</activiti.version> <spring.security.version>5.0.4.RELEASE</spring.security.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- thymeleaf --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- swagger依赖 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.2.2</version> </dependency> <!-- lombok依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.8</version> </dependency> <!-- 数据源连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.19</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <!-- 通用mapper --> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>1.1.5</version> </dependency> <!-- pagehelper 分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> <!--<exclusions>--> <!--<exclusion>--> <!--<groupId>org.mybatis.spring.boot</groupId>--> <!--<artifactId>mybatis-spring-boot-starter</artifactId>--> <!--</exclusion>--> <!--</exclusions>--> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.16</version> </dependency> <!-- Activiti start --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>${activiti.version}</version> <exclusions> <exclusion> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <artifactId>spring-context</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-jdbc</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-tx</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-orm</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>mybatis</artifactId> <groupId>org.mybatis</groupId> </exclusion> <exclusion> <artifactId>activation</artifactId> <groupId>javax.activation</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-modeler</artifactId> <version>${activiti.version}</version> <exclusions> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-context</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-tx</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-web</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-security-config</artifactId> <groupId>org.springframework.security</groupId> </exclusion> <exclusion> <artifactId>spring-security-core</artifactId> <groupId>org.springframework.security</groupId> </exclusion> <exclusion> <artifactId>spring-security-crypto</artifactId> <groupId>org.springframework.security</groupId> </exclusion> <exclusion> <artifactId>spring-security-web</artifactId> <groupId>org.springframework.security</groupId> </exclusion> <exclusion> <artifactId>spring-webmvc</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>activation</artifactId> <groupId>javax.activation</groupId> </exclusion> <exclusion> <artifactId>commons-io</artifactId> <groupId>commons-io</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-rest</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-explorer</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-webapp-explorer2</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-diagram-rest</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-simple-workflow</artifactId> <version>${activiti.version}</version> </dependency> <!-- Activiti end --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- mybatis generator --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.5</version> <dependencies> <!--配置这个依赖主要是为了等下在配置mybatis-generator.xml的时候可以不用配置classPathEntry这样的一个属性,避免代码的耦合度太高--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>3.4.0</version> </dependency> </dependencies> <executions> <execution> <id>Generate MyBatis Artifacts</id> <phase>package</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <!--允许移动生成的文件--> <verbose>true</verbose> <!-- 是否覆盖--> <overwrite>true</overwrite> <!-- 自动生成的配置 --> <configurationFile>src/main/resources/mybatis-generator-cfg.xml</configurationFile> </configuration> </plugin> </plugins> </build> </project>
通过测试方法生成表
在添加依赖后,在SpringBoot的测试类ApplicationTests中写一个方法,如下:
/**
* 测试生成Activiti的表结构
*/
@Test
public void createTable(){
//流程引擎配置
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
configuration.setJdbcDriver("com.mysql.jdbc.Driver");
configuration.setJdbcUrl("jdbc:mysql://localhost:3306/itsm?characterEncoding=UTF-8&useUnicode=true");
configuration.setJdbcUsername("root");
configuration.setJdbcPassword("root");
//DB_SCHEMA_UPDATE_FALSE = "false";//不能自动创建表,需要表存在
//DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";//先删除表再创建表
//DB_SCHEMA_UPDATE_TRUE = "true";//如果表不存在,自动创建表
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//根据引擎配置构建引擎
ProcessEngine engine = configuration.buildProcessEngine();
}
运行此方法后会生成Activiti的25表,如下:
通过配置文件生成表
官网的配置文件如下:
官网的文档链接:Activiti5.x用户指导文档
在项目的resources目录下创建activiti.cfg.xml配置文件【Activiti默认配置文件的名称就是activiti.cfg.xml】,官网上给的配置示例中使用的是h2数据库,把数据库的连接信息改成自己项目的数据库信息,然后在测试类写一个方法,生成数据库表。activiti.cfg.xml文件如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--<import resource="classpath:/application-dev.properties"/>-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="databaseType" value="mysql"/>
<!--<property name="dataSource" value=""/>-->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/itsm?characterEncoding=UTF-8&useUnicode=true" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="root" />
<!--<property name="dataSource" ref="dataSouce"/>-->
<!--DB_SCHEMA_UPDATE_FALSE = "false";//不能自动创建表,需要表存在-->
<!--DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";//先删除表再创建表-->
<!--DB_SCHEMA_UPDATE_TRUE = "true";//如果表不存在,自动创建表-->
<property name="databaseSchemaUpdate" value="true" />
<!-- 历史记录级别 -->
<property name="history" value="full" />
<!-- 事务管理 -->
<!-- 是否启动jobExecutor -->
<property name="jobExecutorActivate" value="false" />
<!-- 是否启动异步执行,通过线程池管理 -->
<!--<property name="asyncExecutorEnabled" value="true" />-->
<!-- 激活异步执行 -->
<!--<property name="asyncExecutorActivate" value="false" />-->
<property name="dbIdentityUsed" value="false"/>
<!-- 邮件服务器配置 -->
<!--<property name="mailServerHost" value="mail.my-corp.com" />-->
<!--<property name="mailServerPort" value="5025" />-->
<!-- 指定工作流字体,避免流程图中文乱码 -->
<property name="activityFontName" value="宋体"/>
<property name="labelFontName" value="宋体"/>
<property name="annotationFontName" value="宋体"/>
</bean>
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
<!-- 创建activiti的服务 -->
<!-- 工作流仓储服务 -->
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
<!-- 工作流运行服务 -->
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
<!-- 工作流任务服务-->
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
<!-- 工作流历史服务-->
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
<!-- 工作流管理服务-->
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
<!-- 工作流身份组织机构服务 -->
<bean id="IdentityService" factory-bean="processEngine" factory-method="getIdentityService" />
</beans>
测试方法代码:
/**
* 测试生成Activiti的表结构
*/
@Test
public void createTable(){
// //流程引擎配置
// ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
//
// configuration.setJdbcDriver("com.mysql.jdbc.Driver");
// configuration.setJdbcUrl("jdbc:mysql://localhost:3306/itsm?characterEncoding=UTF-8&useUnicode=true");
// configuration.setJdbcUsername("root");
// configuration.setJdbcPassword("root");
//
// //DB_SCHEMA_UPDATE_FALSE = "false";//不能自动创建表,需要表存在
// //DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";//先删除表再创建表
// //DB_SCHEMA_UPDATE_TRUE = "true";//如果表不存在,自动创建表
// configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP);
// //根据引擎配置构建引擎
// ProcessEngine engine = configuration.buildProcessEngine();
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
ProcessEngine engine = configuration.buildProcessEngine();
}
集成中遇到的问题及解决
其实我在集成Activiti的时候,引入的依赖包和排除的依赖包比较包,原来是可以更简单的——引入activiti的starter,如下
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>${activiti.version}</version>
</dependency>
但这样却引发了包冲突,排除冲突的架包之后,项目根本启动不了,很多异常,找了网上说的解决办法,比如在SpringBoot的应用入口类的注解@SpringBootApplication排除Activiti的一个安全配置类,还有在MyBatis及插件的依赖中排除特殊的架包,但依然启动不成功,没办法,只能是暂时换回这种比较原始的方法来集成。