Spring Boot1.5迁2.x(Java10+QueryDsl)编译错误解决
我刚帮几个项目搞定过类似的迁移,你的问题其实都是Spring Boot 2.x升级里的典型坑,咱们一步步来解决:
1. 先搞定Maven版本依赖与Java版本配置
① Java版本正确写法
Java 10的话,直接用 <java.version>10</java.version> 就对了。Maven从maven-compiler-plugin:3.6.0开始支持这种新的版本命名方式,所以你得确保插件版本至少是3.6.0,配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- 用这个稳定版本就行 --> <configuration> <release>10</release> <!-- 这个参数比source/target更靠谱,自动适配Java 10的特性 --> </configuration> </plugin> </plugins> </build>
别用1.10,那是旧的命名方式,Java 9之后就不再使用了。
② 解决依赖版本不一致(2.0.1而非2.0.2)
因为你没使用Spring Boot Starter Parent,必须手动引入spring-boot-dependencies的dependency management来强制锁定所有Spring Boot相关依赖的版本,不然Maven会自动拉取最近的兼容版本(比如2.0.1)。配置如下:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
这个配置要放在<dependencies>标签之前,它会帮你统一所有Spring Boot starter的版本,避免出现版本混乱。
2. 修复编译错误:类找不到/包不存在
① EmbeddedServletContainerCustomizer 替换
Spring Boot 2.x把这个类彻底换掉了,原来的EmbeddedServletContainerCustomizer要替换成WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>。举个例子:
原来的代码:
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; @Component public class ServletContainerCustomizer implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.setPort(8081); } }
改成:
import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.stereotype.Component; @Component public class ServletContainerCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { @Override public void customize(ConfigurableServletWebServerFactory factory) { factory.setPort(8081); } }
② QueryDslPredicateExecutor 相关问题
JHipster 4.13.3用的QueryDsl 4.1.4和Spring Boot 2.0.x不兼容,你需要升级QueryDsl到4.2.1(这个版本是Spring Boot 2.0.x官方推荐的兼容版本)。同时要调整Maven里的QueryDsl依赖和APT插件配置:
首先,更新QueryDsl的依赖:
<dependencies> <!-- QueryDsl核心依赖 --> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-core</artifactId> </dependency> <!-- APT依赖,用于生成Q类 --> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <scope>provided</scope> </dependency> </dependencies>
然后调整APT插件(因为Java 10用的是JPMS,需要添加--release参数):
<build> <plugins> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> <options> <release>10</release> </options> </configuration> </execution> </executions> </plugin> </plugins> </build>
另外,如果你用了QueryDslRepositorySupport,注意Spring Data JPA 2.0.x里的包路径有变化,从org.springframework.data.querydsl.QueryDslRepositorySupport改成org.springframework.data.jpa.repository.support.QueryDslRepositorySupport,需要调整import语句。
3. 其他JHipster相关的兼容调整
因为JHipster 4.13.3是针对Spring Boot 1.5做的,还有几个地方要注意:
- 安全配置:Spring Security 5.x(Spring Boot 2.x默认用这个)的密码编码方式变了,原来的
PasswordEncoder相关配置可能需要调整,比如确保BCryptPasswordEncoder的导入路径正确,禁用默认密码编码器的规则也有变化。 - 数据源配置:Spring Boot 2.x里的
DataSourceBuilder的用法有变化,原来的DataSourceBuilder.create()需要改成DataSourceBuilder.create(getClass().getClassLoader())或者指定类加载器。 - Actuator端点:如果用了Actuator,端点的路径和默认开启状态变了,比如
/health现在需要配置management.endpoints.web.exposure.include=health才能访问。
最后,建议你先把依赖和Java版本的问题解决,再逐个修复编译错误,这样能减少很多干扰。
内容的提问来源于stack exchange,提问作者neblaz

