如何制作一个简单的gradle构建脚本来编译java程序?

eoigrqb6  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(443)

我正在努力学习如何使用gradle来简化java程序的编译和打包。我已经有java编程的经验,通常我只是使用eclipse来管理它,或者,我只是手动编译我的程序(在终端中使用javac)。然而,我已经到了想使用gradle最容易使用和维护的库的地步。
为了更多地了解gradle的工作原理,我访问了gradle网站,那里有一些教程,用于编写java应用程序时使用的简单gradle设置(这就是我找到的)。然而,本教程并没有真正解释这其中的任何一个应该是如何工作的,它似乎假设您正在遵循某个特定的系统来进行项目的布局。它还包括一些测试程序,或者在构建程序时测试程序的东西。除此之外,它从未真正解释过运行gradle build函数是如何工作的,也没有解释过在哪里(以及什么)文件保存了构建程序时它所做的操作的指令。
所以从本质上说,我想问的是,是否有人能解释一下创建一个简单的gradle环境的步骤,这个环境只需编译一组 .java 文件并将其放入可执行jar中,或将其作为 .class 文件在单独的 bin 文件夹之类的。如果你解释一下每个部分都在做什么,以及我如何进行更改来添加更多的东西(比如基本的依赖关系,也许是添加 .exe Package 机周围 .jar 等)

c7rzv4ha

c7rzv4ha1#

让我们从一个简单的问题开始:构建java项目需要哪些基本步骤?好吧,只要您的项目不使用某些花哨的预处理或代码生成,第一步可能是编译 .java 文件到 .class 文件夹。那些 .class 文件(和资源,如果提供)可以打包到 .jar 文件。现在对您来说可能不太明显,但一般来说,您还应该在构建项目时运行(单元)测试。根据您的项目,可能有更多可能的步骤(例如,发布、文档、质量控制)。
在gradle中,这些步骤称为任务。任务基本上可以做任何有助于构建软件的事情。这通常意味着任务获取一些输入文件并将其转换为一些输出文件。例如,编译任务 .java 文件到 .class 文件夹。另一项任务可以改变 .class 文件到 .jar 文件(让我们称此任务为jar任务)。自从 .class 需要创建文件才能将它们放入 .jar jar任务依赖于编译任务。您可以使用gradle来表示这种关系,因此每次jar任务运行时,gradle都会确保编译任务已经提前运行。任务不需要做什么,它们可能只是用来表示这样的关系(这样的任务称为生命周期任务)。您可以创建特定任务类型的任务以重用功能,例如,两个不同的任务可用于编译生产代码和测试代码,但它们都在内部使用编译器,并且只对不同的输入文件集进行操作。
您可以手动创建任务,我明确建议您创建一些任务,以了解它们之间的关系及其执行方式,但通常不需要在构建脚本中创建任务,因为所有必需的任务都是由插件创建的。gradle插件非常强大,因为它们基本上可以在构建脚本中手动完成所有事情,并且有一个插件可以完成构建过程中几乎所有可能需要完成的事情。
[…]我在问是否有人能解释一下创建一个简单的gradle环境的步骤,这个环境只编译一组.java文件[…]
使用gradle编译java项目最简单的方法是创建一个文件 build.gradle 包括以下内容:

plugins {
    id 'java'
}

就这样!gradle已经准备好构建您的项目(只需运行 gradle build ). 这怎么可能?好吧,java插件创建了编译、测试和打包项目所需的所有任务,并将它们配置为遵循常见约定。看看java插件的文档,它甚至包含了一个很好的图像,显示了所有任务及其依赖关系。如图所示 build 任务依赖于所有其他任务。当您调用 gradle build . 你也可以打电话 gradle jar 或者 gradle assemble gradle将只运行构建 .jar 文件。
[…]似乎认为您在遵循某个特定的系统进行项目布局。
是的,gradle采用了一种称为convention over configuration的方法。这意味着对于任何需要手动配置的东西都有一个约定(以某种方式通用或有用)。
此方法的一个简单示例是预期源文件和资源文件的位置。如您所见,在上面的构建脚本中没有配置此位置。但是,有一个约定(由maven建立)是 .java 源文件应进入 src/main/java 生产代码和 src/test/java 测试代码。当然,这些路径可能会改变,但是在大多数项目中,您应该简单地遵守约定。
如果您解释一下每个部分都在做什么,以及如何进行更改以添加更多内容(如基本依赖项[…]),也会很有帮助
让我们简单地看一下教程中的构建文件:

plugins {
    id 'application' 
}

repositories {
    jcenter() 
}

dependencies {
    testImplementation 'junit:junit:4.13' 
    implementation 'com.google.guava:guava:29.0-jre' 
}

application {
    mainClass = 'demo.App' 
}

第一个块类似于上面的示例,但不是带有标识符的插件 java 具有标识符的插件 application 已应用。但是,这不会有太大的改变,因为应用程序插件在内部也应用了java插件。
现在让我们看看这些积木 repositories 以及 dependencies . 这个 dependencies 块可用于注册依赖项。您可以在本地服务器上添加依赖项 .jar 文件,在其他gradle项目(在多项目构建中)或外部模块上。单词external指的是提供可在项目中使用的库的远程存储库。里面的线 dependencies 每个块通过定义依赖范围和模块标识符来表示特定的依赖关系,模块标识符由组标识符、工件标识符和版本(使用 : 作为分隔符)。依赖范围(在gradle中也称为配置)基本上定义了在何处以及如何使用依赖关系。例如,第一个依赖只能在测试代码中使用(由于 testImplementation 范围)。现在gradle知道构建项目需要什么库,但是它不知道从哪里获得该库。在这里 repositories 块来解救,因为它可以用来定义gradle应该在哪里查找外部模块依赖项。大部分时间你将主要使用 jcenter() , mavenCentral() 或者 google() 但是,也可以添加可在自定义URL下访问的存储库。
最后一部分应用了一个必要的配置,因为不能应用任何有用的约定。gradle根本不知道应该将项目中的哪个类用作应用程序的主类,因此必须手动定义它。
现在,多亏了应用程序插件,您不仅可以使用 gradle build ,但也可以使用 gradle run ,作为任务 run 是在java插件创建的任务之上创建的任务之一。

相关问题