隨便一說
因爲需要搭建公司新的框架,使用了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及插件的依賴中排除特殊的架包,但依然啓動不成功,沒辦法,只能是暫時換回這種比較原始的方法來集成。