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

启用Zip64构建Jar包后主类无法找到或加载的问题咨询

问题描述

原本使用Gradle构建Jar包时无需启用Zip64,通过./gradlew jobsJar即可完成构建,且java -jar build/libs/jobs-listabl-0.0.1.jar能正常运行。添加新依赖后必须设置zip64 = true才能完成构建,但执行相同运行命令时出现错误:

Error: Could not find or load main class app.listabl.jobs.JobsKt
Caused by: java.lang.ClassNotFoundException: app.listabl.jobs.JobsKt

已检查MANIFEST.MF配置和Jar内类路径均正常,但主类仍无法加载。当前build.gradle配置如下:

tasks.register('jobsJar', Jar) {
    zip64 = true //this was added as it would not build without
    manifest {
        attributes 'Main-Class': 'app.listabl.jobs.JobsKt',
                'Implementation-Title': 'Gradle Jar File Example'
    }
    archiveBaseName = 'jobs-listabl'
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}
解决方案

1. 确认Java运行环境版本

Zip64格式的Jar需要Java 7及以上版本支持,若使用的Java版本过低会导致类加载失败。执行java -version确认版本,确保在Java 7或更高版本运行。

2. 调整打包任务,确保主类字节码被正确打包

原配置中with jar可能没有正确包含项目自身的编译产物,启用Zip64后可能存在路径解析问题。修改任务配置,明确指定包含项目编译后的类文件:

tasks.register('jobsJar', Jar) {
    zip64 = true
    manifest {
        attributes 'Main-Class': 'app.listabl.jobs.JobsKt',
                'Implementation-Title': 'Gradle Jar File Example'
    }
    archiveBaseName = 'jobs-listabl'
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    // 先添加项目自身的编译类文件
    from sourceSets.main.output
    // 再添加依赖包内容
    from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

3. 验证Jar包内容完整性

执行以下命令检查Jar包中是否存在主类的字节码文件:

jar tf build/libs/jobs-listabl-0.0.1.jar | grep "app/listabl/jobs/JobsKt.class"

如果没有输出,说明主类未被正确打包,需要检查项目编译任务是否正常执行,或sourceSets.main.output路径是否正确。

4. 改用Shadow插件打包(推荐)

Gradle原生Jar任务对大体积Zip64 Jar的支持有限,使用Shadow插件可以更稳定地构建包含大量依赖的可执行Jar,同时自动处理Zip64和类路径问题:

  1. 在build.gradle中添加Shadow插件依赖:
plugins {
    id 'com.github.johnrengelman.shadow' version '8.1.1'
    // 保留你原有的其他插件如kotlin-jvm等
}
  1. 配置Shadow任务:
shadowJar {
    zip64 = true
    manifest {
        attributes 'Main-Class': 'app.listabl.jobs.JobsKt'
    }
    archiveBaseName = 'jobs-listabl'
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
  1. 执行构建命令:
./gradlew shadowJar

运行生成的Jar包(路径通常为build/libs/jobs-listabl-0.0.1-all.jar):

java -jar build/libs/jobs-listabl-0.0.1-all.jar

内容的提问来源于stack exchange,提问作者Youssef Kandil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:53:28