将Spring Boot+Activiti应用迁移至Java 10的模块依赖冲突问题求助
这些错误都是Java 9+模块系统(JPMS)中典型的**拆分包(Split Package)**问题——同一个Java包被多个模块(或模块与未命名模块)同时导出,这违反了JPMS的模块化规则。下面是针对你遇到的问题的具体解决方案:
1. 解决org.apache.commons.logging包冲突
Spring Boot 2.0+已经默认使用spring-jcl作为日志桥接实现,而Activiti 6.0.0的starter依赖可能引入了jcl-over-slf4j,两者都提供了org.apache.commons.logging相关包,导致冲突。
你需要在Activiti的依赖中排除jcl-over-slf4j,统一使用Spring Boot提供的spring-jcl:
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version> <exclusions> <!-- 排除冲突的日志桥接依赖 --> <exclusion> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </exclusion> </exclusions> </dependency>
可以执行mvn dependency:tree命令验证,确保项目中只有spring-jcl提供org.apache.commons.logging相关包。
2. 解决javax.el包冲突
这个冲突来自Activiti依赖的juel-api/juel-impl和Spring Boot Web starter依赖的tomcat.embed.el,两者都导出了javax.el包。由于Spring Boot已经提供了Tomcat的EL实现,完全可以替代JUEL,所以需要排除Activiti中的JUEL依赖:
在Activiti的依赖排除中添加以下内容:
<exclusion> <groupId>de.odysseus.juel</groupId> <artifactId>juel-api</artifactId> </exclusion> <exclusion> <groupId>de.odysseus.juel</groupId> <artifactId>juel-impl</artifactId> </exclusion>
3. 优化module-info.java配置
你的模块声明可以更精准,同时避免不必要的依赖:
open module testmod { requires spring.boot; requires spring.boot.autoconfigure; requires spring.boot.starter.web; // 直接依赖Web Starter的自动模块 requires java.sql; // 移除requires java.se; 因为Spring Boot的依赖已包含所需的基础模块 exports com.test; }
4. 确保Maven编译器插件支持Java 10
旧版本的Maven编译器插件对Java 9+的模块系统支持不佳,建议在pom.xml中添加指定版本的插件:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>10</release> </configuration> </plugin> </plugins> </build>
完成以上修改后,重新执行构建应该就能解决所有拆分包相关的错误了。
内容的提问来源于stack exchange,提问作者sidgate

