Spring boot Activiti升级记:一场无关风花雪月的扯蛋经历

问题描述

spring-boot-starter-parent版本升级,导致程序无法启动。
版本升级:

2.1.2.RELEASE -> 2.2.7.RELEASE

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.7.RELEASE</version>
</parent>

<dependencies>
	<dependency>
		<groupId>org.activiti</groupId>
		<artifactId>activiti-spring-boot-starter-basic</artifactId>
		<version>5.22.0</version>
	</dependency>
</dependencies>

异常信息:

java.lang.IllegalArgumentException: Could not find class [org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration]
...
Caused by: java.land.ClassNotFoundException: org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

问题原因

spring boot的类路径发生变化:
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration
更改成:
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

activiti的自动配置文件:org.activiti.spring.boot.SecurityAutoConfiguration中引用了更改之前的类,所以报错找不到。

@Configuration
@AutoConfigureBefore(org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class)
public class SecurityAutoConfiguration {}

解决方法

弃用activiti-spring-boot-starter-basic。
手动引入activiti的dependency和config

pom.xml配置方式:

parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.7.RELEASE</version>
</parent>

<dependencies>
	<dependency>
		<groupId>org.activiti</groupId>
		<artifactId>activiti-engine</artifactId>
		<version>5.22.0</version>
	</dependency>
	<dependency>
		<groupId>org.activiti</groupId>
		<artifactId>activiti-spring</artifactId>
		<version>5.22.0</version>
	</dependency>
</dependencies>

只需要依赖activiti-engine 和activiti-spring就可以,其他的依赖会间接引入。

配置config,初始化activiti。其中有省略。

@Configuration
public class WorkflowConfiguration {
    @Bean
    @ConfigurationProperties(prefix="acitiviti.datasource")
    public DataSource activitiDataSource () {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration(PlatformTransactionManager transactionManager, SpringAsyncExecutor springAsyncExecutor) throws Exception {
        SpringProcessEngineConfiguration config = new SpringProcessEngineConfigturation();
        config.setDataSource();
        config.setTransactionManager();
        config.setAsyncExecutor();
        
        ...
        retrurn config;
    }
    
    @Bean
    public ProcessEngineFactoryBean springProcessEngineBean(SpringProcessEngineConfiguration configuration) {
    ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
    processEngineFactoryBean.setProcessEngineConfiguration(configuration);
    return processEngineFactoryBean;
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public RuntimeService runtimeServiceBean(ProcessEngine processEngine) {
    return processEngine.getRuntimeService();
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public RepositoryService repositoryServiceBean(ProcessEngine processEngine) {
    return processEngine.getRepositoryService();
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public TaskService taskServiceBean(ProcessEngine processEngine) {
    return processEngine.getTaskService();
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public HistoryService historyServiceBean(ProcessEngine processEngine) {
    return processEngine.getHistoryService();
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public ManagementService managementServiceBeanBean(ProcessEngine processEngine) {
    return processEngine.getManagementService();
  }

  @Bean
  @ConditionalOnMissingBean
  public TaskExecutor taskExecutor() {
    return new SimpleAsyncTaskExecutor();
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public IntegrationContextManager integrationContextManagerBean(ProcessEngine processEngine) {
    return super.integrationContextManagerBean(processEngine);
  }

}

解决问题历程

  1. 吐槽spring boot:生了个小版本,结果把包路改变了!
  2. 定位问题。升级spring boot后,并不知道是activiti的问题。最后是挨个依赖删除,才定位到问题。
  3. 升级activiti:先是升级到6.0.0,发现是同样的问题,抛出同样的错误。升级到activiti7,依赖为:
	<dependency>
		<groupId>org.activiti</groupId>
		<artifactId>activiti-spring-boot-starter</artifactId>
		<version>7.*</version>
	</dependency>

然而还是不好用,但是错误发生了变化。
还有一个问题,activiti提供的编程接口发生了变化!
4. 去掉activiti-spring-boot-starter,直接依赖activiti

总结

spring boot太不讲究了,你升级个小版本,变个屁的包路径!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章