使用本地Jar文件的最简Gradle项目运行报ClassNotFoundException如何解决
问题原因
- 你当前Gradle配置中的默认jar任务仅会打包项目本身的Java代码编译产物,不会将
libs目录下的第三方依赖(比如javax.json相关jar包)合并到最终生成的jar中,也没有在Manifest文件中声明依赖的类路径,所以直接运行java -jar时JVM无法找到第三方类,抛出ClassNotFoundException。 ./build/scripts/Project启动脚本报错是因为你仅在jar任务的Manifest中配置了主类,没有给application插件配置全局主类参数,导致生成的启动脚本缺少主类配置,触发参数错误提示。
修复方案
直接替换你的build.gradle为以下配置即可,完全保留本地jar依赖的使用方式,无需额外修改项目结构:
apply plugin: 'java' apply plugin: 'application' // 配置application插件的主类,解决启动脚本报错问题 mainClassName = 'driver.helloJSON' dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } jar { manifest { attributes 'Main-Class': 'driver.helloJSON' } // 将所有依赖的jar包内容合并到最终产物中,生成可直接运行的胖jar from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } // 避免多依赖中存在重复文件时构建报错 duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
修改完成后执行构建命令:./gradlew clean build
构建完成后即可直接运行:
- 用jar包运行:
java -jar ./build/libs/Project.jar - 用启动脚本运行:
./build/scripts/Project
两种方式都可以正常启动项目,无需额外配置类路径。
内容的提问来源于stack exchange,提问作者skyfire
相关产品推荐
相关产品推荐

