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太不講究了,你升級個小版本,變個屁的包路徑!

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