讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

Gradle构建Java CLI应用:JAR文件输出位置与分发策略详解

胖杰大大_7635

胖杰大大_7635

发布时间:2025-11-14 19:59:01

|

431人浏览过

|

来源于php中文网

原创

Gradle构建Java CLI应用:JAR文件输出位置与分发策略详解

本文详细探讨了gradle构建java命令行应用时,`gradlew jar`任务未在预期位置生成jar文件的问题。核心原因在于多模块或`application`插件项目结构下,jar文件可能位于特定模块的`build/libs`子目录。文章提供了查找jar的解决方案,并进一步讨论了java cli应用的分发最佳实践,包括使用`installdist`、`distzip`以及graalvm原生镜像等高级方法,以确保用户能便捷地运行应用。

理解Gradle JAR文件生成机制

在使用Gradle构建Java项目时,jar任务负责将项目的编译输出打包成一个JAR文件。对于一个简单的单模块Java项目,通常在运行gradlew jar后,生成的JAR文件会位于项目的根目录下的build/libs目录中。然而,在某些特定的项目结构或插件配置下,这一默认行为可能会有所不同,导致开发者在预期位置找不到生成的JAR文件。

常见问题:JAR文件“失踪”

许多开发者在初次使用Gradle构建Java命令行界面(CLI)应用时,会遇到一个困惑:执行gradlew jar命令后,构建过程显示BUILD SUCCESSFUL,但检查项目根目录下的build/libs目录,却发现该目录为空或根本不存在。

例如,在以下build.gradle.kts配置中,项目使用了application插件,并定义了各种依赖:

plugins {
    application
    id("com.diffplug.spotless") version "6.12.0"
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("junit:junit:4.13.2")
    implementation("com.google.guava:guava:30.1-jre")
    implementation("info.picocli:picocli:4.7.0")
    annotationProcessor("info.picocli:picocli-codegen:4.7.0")
    implementation("io.vavr:vavr:0.10.4")
}

application {
    mainClass.set("testlauncher.command.Runner")
}

subprojects {
    apply {
        plugin("com.diffplug.spotless")
    }
}

spotless {
    java {
        importOrder()
        removeUnusedImports()
        googleJavaFormat()
    }
}

project.tasks.findByName("build")?.dependsOn(project.tasks.findByName("spotlessApply"))

尽管配置看似无误,gradlew jar也成功运行,但JAR文件却不在预期的./build/libs中。

立即学习“Java免费学习笔记(深入)”;

解决方案:检查正确的输出路径

问题的核心在于项目结构。当使用application插件时,Gradle可能会在内部将应用视为一个“子项目”或将其输出定向到特定的子目录。最常见的情况是,如果你的源代码(例如src/main/java)位于一个名为app的子目录中(或者Gradle隐式地将主应用模块命名为app),那么生成的JAR文件将位于该子模块的构建目录中。

因此,在这种情况下,正确的JAR文件路径是: ./app/build/libs

开发者应检查自己的项目目录结构,特别是如果存在多模块设置或application插件的默认行为导致输出目录发生偏移。

如何确认JAR文件的实际位置:

  1. 手动检查目录: 导航到项目根目录,然后尝试进入app/build/libs、main/build/libs或其他可能的模块名下的build/libs。
  2. 使用build任务的输出: 运行gradlew build。在构建日志中,通常会打印出生成JAR文件的路径。
  3. 查询Gradle任务属性: 可以通过Gradle的API来查询jar任务的archiveFile属性:
    gradlew :jar --console=plain | grep "archiveFile"

    或者在build.gradle.kts中临时添加打印语句:

    tasks.jar {
        doLast {
            println("JAR file path: ${archiveFile.get()}")
        }
    }

    运行gradlew jar后,会打印出JAR文件的完整路径。

Java CLI应用的分发策略

仅仅生成一个JAR文件通常不是分发Java CLI应用的最佳方式,因为它要求用户手动管理Java运行时环境(JRE/JDK)和所有依赖项。为了提供更好的用户体验,Gradle提供了更高级的分发机制。

1. 使用application插件进行分发

application插件不仅可以运行CLI应用,还提供了方便的分发任务:

  • installDist: 将应用程序及其所有依赖项复制到build/install/目录中。这个目录包含可执行脚本(Windows的.bat和Unix/Linux的shell脚本),用户可以直接运行这些脚本来启动应用,无需手动配置classpath。

    Browse website - Crawls sites automatically and mounts pages as markdown files you can grep, diff, cat, and explore with standard Unix commands — over SSH or HTTP
    Browse website - Crawls sites automatically and mounts pages as markdown files you can grep, diff, cat, and explore with standard Unix commands — over SSH or HTTP

    将任意网站转换为文件系统,自动抓取网站并将页面挂载为 Markdown 文件,可使用 grep、diff、cat 等标准 Unix 命令进行搜索、比较、读取和浏览。

    下载
    gradlew installDist

    执行后,会在build/install//bin目录下生成启动脚本。

  • distZip 和 distTar: 生成包含应用程序、所有依赖项和启动脚本的压缩包(ZIP或TAR)。用户下载这些压缩包后,解压即可运行。这是分发CLI应用最常见和推荐的方式之一。

    gradlew distZip
    # 或
    gradlew distTar

    生成的压缩包位于build/distributions目录下。

这些分发任务会自动处理所有运行时依赖,并生成平台无关的启动脚本,极大地简化了用户的部署过程。

2. 构建“胖JAR”(Fat JAR / Uber JAR)

“胖JAR”是将应用程序代码及其所有依赖项(包括第三方库)打包到一个独立的JAR文件中的技术。这样,用户只需要一个JAR文件即可运行应用,无需额外的依赖管理。

要创建胖JAR,通常需要使用专门的Gradle插件,例如shadow插件:

// build.gradle.kts
plugins {
    application
    id("com.github.johnrengelman.shadow") version "8.1.1" // 添加shadow插件
}

// ... 其他配置 ...

tasks.shadowJar {
    archiveBaseName.set("my-cli-app") // 设置胖JAR的基础名称
    archiveClassifier.set("") // 移除默认的classifier,使之成为主JAR
    manifest {
        attributes["Main-Class"] = application.mainClass.get() // 指定主类
    }
}

// 可选:让build任务依赖shadowJar
tasks.build {
    dependsOn(tasks.shadowJar)
}

运行gradlew shadowJar,生成的胖JAR文件通常位于build/libs目录下,文件名可能类似于my-cli-app-all.jar或my-cli-app.jar。

3. 使用GraalVM生成原生镜像

对于追求极致性能和完全独立可执行文件的场景,可以考虑使用GraalVM Native Image技术。GraalVM可以将Java应用程序编译成一个自包含的原生可执行文件,无需JVM即可运行,启动速度快,内存占用低。

这通常需要配置GraalVM环境,并在build.gradle.kts中集成相应的插件(如org.graalvm.buildtools.native),然后运行特定的构建任务。

// build.gradle.kts (示例,具体配置可能因GraalVM版本而异)
plugins {
    application
    id("org.graalvm.buildtools.native") version "0.9.28"
}

// ... 其他配置 ...

graalvmNative {
    binaries {
        named("main") { // main是application插件默认的二进制名称
            mainClass.set(application.mainClass.get())
            // 添加其他配置,如构建参数、JVM参数等
            // args.add("-H:+ReportExceptionStackTraces")
        }
    }
}

运行gradlew nativeCompile(或类似任务),会在build/native/main等目录下生成一个原生可执行文件。

总结

当gradlew jar未在预期位置生成JAR文件时,首先应检查项目结构,特别是对于使用了application插件或存在多模块的项目,JAR文件很可能位于特定模块(如app)的build/libs子目录中。

在分发Java CLI应用时,直接提供一个裸JAR文件并非最佳实践。推荐使用Gradle的application插件提供的installDist、distZip或distTar任务来创建包含所有依赖和启动脚本的完整分发包,以简化用户体验。对于更高级的需求,可以考虑使用shadow插件创建胖JAR,或者利用GraalVM Native Image生成独立的本地可执行文件。选择哪种分发方式取决于应用的复杂性、目标用户群以及对性能和部署便捷性的要求。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3439

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2998

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1548

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2719

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3350

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1717

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

2537

2023.08.28

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

5407

2023.08.30

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn