You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle构建Eclipselink/Spring Boot项目遇两类ClassNotFoundException问题

解决方案:QueryDslPredicateExecutor类未找到与可执行JAR类缺失问题

嘿,我来帮你搞定这两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:27:05