掘金 后端 ( ) • 2024-04-21 10:53

theme: github

1、本地文件

在 Gradle 中,Project.file(java.lang.Object) 方法是一个非常有用的工具,它允许你以一种类型安全的方式引用文件。这个方法可以接收一个字符串路径,返回一个 File 对象,这个对象代表的是一个相对于当前项目目录(或者子项目目录)的文件或目录,或者是指定的绝对路径。

1.1 使用 Project.file 方法

以下是如何使用 Project.file 方法的示例:

// 使用相对路径引用文件
File configFile = file('src/conf.xml')
if (!configFile.exists()) {
    configFile.createNewFile() // 创建文件
}

// 使用绝对路径引用文件
configFile = file('C:\\code\\java\\gradle-01\\conf.xml')
if (!configFile.exists()) {
    println(configFile.createNewFile()) // 创建文件并打印结果
}

// 使用一个已有的 File 对象
File anotherConfigFile = new File('src/config.xml')
println(anotherConfigFile.exists()) // 打印文件是否存在

image-20240420173809382

1.2 相对路径和绝对路径

  • 相对路径:当你使用相对路径时,Gradle 会将其解释为相对于当前项目的根目录(或子项目的根目录)的路径。例如,'src/conf.xml' 会指向当前项目根目录下的 src 子目录中的 conf.xml 文件。

  • 绝对路径:绝对路径直接指向文件系统中的特定位置,不依赖于项目的目录结构。例如,'D:\\conf.xml' 指向 D 盘根目录下的 conf.xml 文件。

1.3 File 对象的操作

使用 Project.file 方法创建的 File 对象是 Java 中的 java.io.File 对象的一个实例。你可以使用它执行各种文件操作,比如检查文件是否存在、创建新文件、读取和写入文件内容等。

1.4 注意事项

  • 当使用 createNewFile() 方法创建新文件时,如果文件已经存在,该方法将返回 false,并且不会覆盖现有文件。
  • 文件操作可能会因权限问题而失败,确保你的应用程序有足够的权限来执行这些操作。
  • 在实际的构建脚本中,通常建议使用 Gradle 提供的专门针对文件操作的任务类型,如 CopyDelete 等,因为它们提供了更好的构建缓存支持和错误处理。

1.5 总结

Project.file 方法是 Gradle 中处理文件和目录的便捷方式,它结合了 Groovy 的简洁性和 Java File 类的功能,使得文件操作更加直观和易于管理。

2、文件集合

在 Gradle 中,FileCollection 接口代表一组文件,这个接口提供了多种方法来操作这组文件。你可以通过 Project.files 方法来创建一个 FileCollection 实例,该方法接受多个参数,包括字符串路径、File 对象数组或集合等。

2.1 创建 FileCollection

以下是如何使用 Project.files 方法创建 FileCollection 实例的示例:

def collection = files('src/test1.txt', new File('src/test2.txt'), ['src/test3.txt', 'src/test4.txt'])

在这个例子中,我们创建了一个包含多个不同类型文件引用的 FileCollection 对象。

2.2 操作 FileCollection

  • 创建文件:使用 forEach 遍历集合,并使用 createNewFile() 方法创建每个文件。
collection.forEach { File it ->
    it.createNewFile()
    println it.name // 输出文件名
}

image-20240420180132419

  • 转换类型FileCollection 可以被转换为 Java 的 SetList 类型。
Set set1 = collection.files // 把文件集合转换为 java 中的 Set 类型
Set set2 = collection as Set
List list = collection as List // 把文件集合转换为 java 中的 List 类型
  • 遍历 List:可以遍历转换后的 List 并执行操作。
for (item in list) {
    println item.name // 输出每个文件的名称
}

image-20240420180215227

  • 集合操作:可以使用 + 来添加一个文件集合,或者使用 - 来从一个集合中删除文件。
def union = collection + files('src/test5.txt') // 添加一个文件到集合
def minus = collection - files('src/test3.txt') // 从集合中删除一个文件
  • 遍历新的集合:可以遍历修改后的集合。
union.forEach { File it ->
    println it.name // 输出添加到集合的每个文件的名称
}

image-20240420180650636

2.3 总结

Gradle 的 FileCollection 提供了一种灵活的方式来处理一组文件。你可以创建文件、遍历、转换集合、以及执行集合间的添加和删除操作。这些功能在编写构建脚本时非常有用,尤其是当你需要对多个文件执行相同操作时。通过使用 FileCollection,你可以编写更简洁、更可读的构建逻辑。

3、文件树

在 Gradle 中,文件树(FileTree)是一种特殊类型的 FileCollection,它表示具有层级结构的文件集合。文件树可以代表一个目录及其所有子目录中的文件,或者可以代表一个压缩文件(如 ZIP 文件)中的内容结构。

文件树不仅具有文件集合的所有功能,还允许你访问文件的相对路径和处理具有层级结构的文件集合。以下是如何创建和使用文件树的示例:

3.1 创建文件树

// 第一种方式:使用路径创建文件树对象,并指定包含的文件
def tree = fileTree('src/main').include('**/*.java')

// 第二种方式:通过闭包创建文件树
tree = fileTree('src/main') {
    include '**/*.java'
}

// 第三种方式:通过路径和闭包创建文件树,使用具名参数给 map 传值
tree = fileTree(dir: 'src/main', include: '**/*.java')

// 包含多个文件类型,并排除特定的目录或文件
tree = fileTree(dir: 'src/main', includes: ['**/*.java', '**/*.xml', '**/*.txt'], exclude: '**/*test*/**')

3.2 使用文件树

  • 遍历文件树:可以使用 each 方法遍历文件树中的所有文件。
tree.each { File file ->
    println file // 输出文件的完整路径
    println file.name // 输出文件名
}

image-20240420181047704

  • 过滤条件:在创建文件树时,你可以使用 includeexclude 方法来指定过滤条件,以包含或排除特定的文件或目录。

3.3 文件树的特点

  • 层级结构:文件树保持了文件的目录结构,允许你访问文件相对于根目录的路径。
  • 过滤模式:使用 Ant 风格的模式(如 **/*.java)来匹配文件和目录。
  • 动态性:文件树的内容是动态生成的,每次访问时都会重新计算,这意味着它会反映文件系统中的当前状态。

3.4 总结

文件树是 Gradle 中处理具有层级结构文件集合的强大工具。通过使用文件树,你可以更方便地处理复杂的文件结构,执行批量文件操作,如复制、删除或分发文件。文件树的过滤功能也使得条件性文件操作变得简单,提高了构建脚本的灵活性和可维护性。

4、文件拷贝

在 Gradle 中,Copy 任务是用来拷贝文件和目录的。它非常灵活,允许你指定要拷贝的文件、目标目录,并且可以通过各种方式来修改拷贝行为,比如过滤、重命名文件等。

4.1 使用 Copy 任务

以下是如何定义和使用 Copy 任务的示例:

task copyTask(type: Copy) {
    // 指定原文件或目录
    from 'src/main/java'
    // 指定目标目录
    into 'src/main/resources'
}

image-20240420181755062

在这个例子中,from 方法用于指定要拷贝的源文件或目录,而 into 方法用于指定目标目录。

4.2 拷贝时的过滤和重命名

  • 过滤条件:可以使用 includeexclude 方法来添加过滤条件,以包含或排除特定的文件。
task copyTaskWithPatterns(type: Copy) {
    from 'src/main/webapp'
    into 'build/explodedWar'
    // 只拷贝 HTML 和 JSP 文件
    include '**/*.html'
    include '**/*.jsp'
    // 排除以 .html 结尾的文件
    exclude { details -> details.file.name.endsWith('.html') }
}
  • 重命名:可以使用 rename 方法来指定一个新的文件名,或者提供一个闭包来动态生成文件名。
task rename(type: Copy) {
    from 'src/main/webapp'
    into 'build/explodedWar'
    // 使用闭包方式重命名文件,移除文件名中的 '-staging-' 文本
    rename { String fileName ->
        fileName.replace('-staging-', '')
    }
}

4.3 使用 Project.copy 方法

除了使用 Copy 任务,Gradle 还提供了 Project.copy 方法,它允许你以更简洁的方式执行拷贝操作:

task copyMethod {
    doLast {
        copy {
            // 相对路径或绝对路径
            from 'src/main/webapp'
            into 'build/explodedWar'
            // 包括 HTML 和 JSP 文件
            include '**/*.html'
            include '**/*.jsp'
        }
    }
}

另一种使用 copy 方法的方式是直接在项目级别进行:

copy {
    from file('src/main/resources/ddd.txt') // 也可以使用 new File('src/main/resources/ddd.txt')
    into buildDir.absolutePath
}

这种方法可以直接在项目的任何地方调用,而不必定义为一个任务。

4.4 执行拷贝操作

要执行拷贝操作,你可以运行相应的任务,例如:

gradle copyTask

或者,如果你使用的是 Project.copy 方法,你可以通过调用注册的闭包来执行拷贝:

gradle copyMethod

4.5 总结

Gradle 提供了多种拷贝文件的方法,包括 Copy 任务、Project.copyproject.copy。每种方法都适用于不同的场景,允许你在构建过程中灵活地拷贝文件和目录。通过使用这些方法,你可以轻松地自动化资源的复制,提升构建脚本的效率。

5、归档文件

在 Gradle 中,处理归档文件是一项常见的任务,特别是当你需要将项目打包成 WAR、ZIP、TAR 等格式以便于发布或部署时。以下是如何使用 Gradle 来创建和操作这些归档文件的详细说明:

5.1 创建 Zip 归档文件

  1. 应用插件:首先,确保你的项目中应用了 Java 插件,这将提供创建 JAR 归档文件所需的类和功能。

image-20240420182737310

  1. 定义任务:然后,定义一个名为 myZip 的任务,并指定其类型为 Zip
task myZip(type: Zip) {
    // 指定ZIP文件内容来源
    from 'src/main/java'
    // 指定ZIP文件解压后的内容存放目录
    into 'build'
    // 设置ZIP文件的基本名称
    archiveBaseName = 'myZip'
    // 设置ZIP文件的扩展名(这里虽然是多余的设置,因为已经默认是zip,但可以用来说明文件类型)
    archiveExtension = 'zip'
    // 设置ZIP文件的版本号
    archiveVersion = '1.0'
}
  1. 执行任务:通过运行 gradle myZip 命令来创建 Zip 文件。
gradle -q myZip

执行上述命令后,Gradle 会在指定的目录中创建一个名为 myGame-1.0.zip 的 Zip 文件。

image-20240420183841075

5.2 使用 zipTreetarTree

Gradle 提供了 zipTreetarTree 方法,它们可以创建一个 FileTree 对象,允许你访问 Zip 或 Tar 压缩包中的内容。这些方法非常适合当你需要将压缩包的内容作为文件集合的一部分来处理时使用。

task zipTree(type: Zip) {
    // 指定打包的源文件,这里使用zipTree()函数来展开一个Zip文件作为打包的源
    from(zipTree('build/distributions/myZip-1.0.zip'))
    // 指定打包后文件的输出目录
    destinationDirectory = file('build/libs')
}

task tarTree(type: Tar) {
    // 指定打包的源文件,这里使用tarTree()函数来展开一个Tar文件作为打包的源
    from(tarTree('build/distributions/myTar-1.0.tar'))
    // 指定打包后文件的输出目录
    destinationDirectory = file('build/libs')
}

官方文档提供了更多关于 Gradle 文件操作的详细信息,包括如何使用文件路径、文件集合、文件树以及如何处理文件和目录的相对路径等。你可以从以下链接访问官方文档:

Gradle 提供了强大的文件操作功能,包括创建和操作归档文件。通过定义任务和使用 Gradle 提供的插件,你可以轻松地将项目打包成所需的格式,并执行各种文件操作。这些功能对于自动化构建和持续集成流程至关重要。