启用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和类路径问题:
- 在build.gradle中添加Shadow插件依赖:
plugins { id 'com.github.johnrengelman.shadow' version '8.1.1' // 保留你原有的其他插件如kotlin-jvm等 }
- 配置Shadow任务:
shadowJar { zip64 = true manifest { attributes 'Main-Class': 'app.listabl.jobs.JobsKt' } archiveBaseName = 'jobs-listabl' duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
- 执行构建命令:
./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
相关产品推荐
相关产品推荐

