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

不使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:45:35