問題描述
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);
}
}
解決問題歷程
- 吐槽spring boot:生了個小版本,結果把包路改變了!
- 定位問題。升級spring boot後,並不知道是activiti的問題。最後是挨個依賴刪除,才定位到問題。
- 升級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太不講究了,你升級個小版本,變個屁的包路徑!