Gradle构建Eclipselink/Spring Boot项目遇两类ClassNotFoundException问题
嘿,我来帮你搞定这两个ClassNotFoundException问题,都是Spring Boot+Gradle+Eclipselink项目里常见的坑,咱们一步步来解决:
1. 解决QueryDslPredicateExecutor类未找到异常
这个异常本质是QueryDSL和Spring Data JPA的整合依赖没配全,或者缺少QueryDSL的代码生成配置(毕竟要生成对应的Q类才能用PredicateExecutor)。
步骤1:补全QueryDSL相关依赖
把下面的依赖加到你的build.gradle里,版本和Spring Boot 2.0.1.RELEASE是匹配的:
dependencies { // Spring Data JPA基础依赖 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // Eclipselink作为JPA实现 implementation 'org.eclipse.persistence:eclipselink:2.7.3' // QueryDSL核心依赖 implementation 'com.querydsl:querydsl-jpa:4.2.1' // 编译期生成QueryDSL查询类的依赖 annotationProcessor 'com.querydsl:querydsl-apt:4.2.1:jpa' annotationProcessor 'org.springframework.boot:spring-boot-starter-data-jpa' }
步骤2:配置QueryDSL代码生成插件
要自动生成实体对应的Q类,得加个Gradle插件配置,这样编译时会自动生成代码:
plugins { id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' } querydsl { jpa = true querydslSourcesDir = 'src/main/generated' // 生成类的存放目录,可自定义 } sourceSets { main { java { srcDirs += querydsl.querydslSourcesDir } } }
执行gradle compileJava后,生成的Q类就会出现在指定目录,Spring Data JPA就能正常识别QueryDslPredicateExecutor接口了。
2. 解决可执行JAR的ClassNotFoundException问题
从你给的脚本片段来看,大概率是依赖配置或者打包参数的问题,咱们逐一排查:
问题1:依赖范围不对
如果你的依赖用了compileOnly或者providedRuntime,这些依赖不会被打包进可执行JAR里,运行时自然找不到。确保所有运行时需要的依赖都用implementation声明。
问题2:主类未明确指定(可选)
如果Spring Boot没自动找到启动类,也会报错。可以在bootJar里手动指定主类:
bootJar { baseName = 'acme-project1' version = '0.1.0' mainClassName = 'com.acme.YourApplicationMainClass' // 替换成你的主类全路径 }
当然,如果主类加了@SpringBootApplication注解,Spring Boot一般能自动扫描到,这一步可以省掉。
完整可用的Gradle脚本模板
给你一个完整的脚本,替换你现有的内容,应该能解决打包问题:
buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' // 配置Java版本,和Spring Boot 2.0.x匹配的话用1.8就行 sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } dependencies { // 如果是Web项目就加这个,不是的话可以去掉 implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.eclipse.persistence:eclipselink:2.7.3' // 示例数据库,换成你实际用的数据库驱动 runtimeOnly 'com.h2database:h2' } bootJar { baseName = 'acme-project1' version = '0.1.0' // 主类路径需要的话就放开注释 // mainClassName = 'com.acme.AcmeProject1Application' }
执行gradle bootJar后,去build/libs目录拿生成的JAR,运行应该就不会报类未找到的错了。
内容的提问来源于stack exchange,提问作者Khushbu

