不使用Shadow插件如何将依赖包打包进Jar解决ClassNotFoundError?
不使用Shadow插件解决picocli依赖ClassNotFoundError的方法
以下是几种无需Shadow插件的可行解决方案:
1. 使用Gradle Application插件(推荐)
借助Gradle的application插件可自动生成包含依赖的可执行脚本,无需手动处理类路径:
- 在
build.gradle中添加插件并指定主类:
plugins { id 'java' id 'application' } mainClassName = 'com.lenovo.cosly.cli.Run' // 替换为你的主类全限定名
- 直接运行项目:
./gradlew run
- 生成可分发的压缩包(包含启动脚本和所有依赖):
./gradlew distZip # 生成zip包,输出在build/distributions目录 # 或 ./gradlew distTar # 生成tar包
解压后通过bin目录下的脚本即可启动项目,脚本会自动处理类路径配置。
2. 手动指定类路径运行Java命令
编译项目后,在运行Java命令时显式指定项目编译产物和picocli依赖的jar包路径:
- 先编译项目:
./gradlew compileJava
- 查找picocli的jar包路径(可通过Gradle命令定位):
./gradlew dependencyInsight --dependency info.picocli:picocli
- 运行时通过
-cp参数指定完整类路径:
java -cp "build/classes/java/main:/path/to/picocli-4.6.3.jar" com.lenovo.cosly.cli.Run
如果有多个依赖,可将所有jar包统一放在lib目录,用通配符简化类路径:
java -cp "build/classes/java/main:lib/*" com.lenovo.cosly.cli.Run
3. 配置Gradle Jar任务打包依赖到lib目录并设置Manifest
通过配置jar任务,在生成的jar包Manifest中声明类路径,同时将依赖复制到指定目录:
- 在
build.gradle中添加如下配置:
plugins { id 'java' } jar { manifest { attributes( 'Main-Class': 'com.lenovo.cosly.cli.Run', // 你的主类全限定名 'Class-Path': configurations.runtimeClasspath.files.collect { "lib/${it.name}" }.join(' ') ) } } // 复制所有依赖到build/libs/lib目录 task copyDependencies(type: Copy) { from configurations.runtimeClasspath into "${buildDir}/libs/lib" } // 确保build任务执行前先完成依赖复制 build.dependsOn copyDependencies
- 执行打包:
./gradlew build
打包完成后,build/libs目录下会有项目jar包和lib文件夹,直接运行以下命令即可启动:
java -jar build/libs/your-project-name.jar
内容的提问来源于stack exchange,提问作者Davie
相关产品推荐
相关产品推荐

