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

Gradle Zip任务:如何为各源文件单独指定压缩包内路径?

问题描述

项目文件布局

ROOT
|-src
| |- main
|    |- java
|    |   \- [rest of java files]
|    |- scripts
|        \- run.bat
|-build
|-build.gradle
|-settings.gradle

期望的压缩包布局

需要创建一个名为dist的Gradle任务,在dist文件夹下生成myproject.zip,压缩包内部结构如下:

ROOT
|
:
|- dist
    \- myproject.zip
        |-lib
        | |-myapp.jar
        \-bin
          |-run.bat

当前的build.gradle代码

plugins {
  id 'java'
}

/* other tasks */

tasks.register('dist', Zip) {
  dependsOn('build')
  from "build/libs/myapp.jar"
  into "lib"

  from "src/main/scripts/run.bat"
  into "bin"  // <<<<--- 此写法无效,会覆盖之前的lib目标路径

  archiveName "myproject.zip"
  destinationDir(file('dist'))
}

疑问

当前写法是否正确?看起来Zip任务只能设置一个into目标路径,但我需要为每个源文件单独指定压缩包内的目标路径,该如何实现需求?


解决方案

你的写法存在问题:into是全局配置,第二次调用into "bin"会覆盖之前的into "lib",最终所有文件都会被放到bin目录下。

要实现不同源文件对应不同压缩包内路径,需要将from和into配对使用,通过闭包嵌套配置来分别处理每组文件:

正确写法一

plugins {
  id 'java'
}

/* other tasks */

tasks.register('dist', Zip) {
  dependsOn('build')
  
  // 将myapp.jar放入压缩包的lib目录
  from("build/libs/myapp.jar") {
    into "lib"
  }
  
  // 将run.bat放入压缩包的bin目录
  from("src/main/scripts/run.bat") {
    into "bin"
  }

  archiveName "myproject.zip"
  destinationDir(file('dist'))
}

正确写法二(按目标目录分组)

plugins {
  id 'java'
}

/* other tasks */

tasks.register('dist', Zip) {
  dependsOn('build')
  
  // 配置lib目录的源文件
  into "lib" {
    from "build/libs/myapp.jar"
  }
  
  // 配置bin目录的源文件
  into "bin" {
    from "src/main/scripts/run.bat"
  }

  archiveName "myproject.zip"
  destinationDir(file('dist'))
}

原理说明

每个from或into方法都可以接收闭包,在闭包内的配置仅对当前组的源文件生效,不会互相干扰,以此实现为不同源文件指定独立的压缩包内路径。

内容的提问来源于stack exchange,提问作者bluearth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:01:20