如何制作一个简单的 gradle 构建脚本来编译 java 程序?
How can I make a simple gradle build script to compile a java program?
我正在尝试学习如何使用 gradle 来简化我的 java 程序的编译和打包。我已经有 java 编程经验,通常我只使用 eclipse 来管理它,或者,我只是手动编译我的程序(在终端中使用 javac)。但是,我已经到了想要使用似乎最容易使用和维护的库 gradle.
的地步
为了进一步了解 gradle 的工作原理,我访问了 gradle 网站,那里有制作简单 gradle 设置的教程,以便在编写 java 应用程序(this 是我找到的那个)。然而,本教程并没有真正解释这些是如何工作的,而且它似乎假设您正在遵循一些特定的项目布局系统。它还包括一些测试程序或在您构建程序时测试您的程序的东西。除了这些东西之外,它从未真正解释过 运行 gradle 构建函数是如何工作的,或者文件在哪里(以及什么)保存了你构建程序时它正在做什么的指令。
所以本质上,我想问的是是否有人可以解释制作简单 gradle 环境的步骤,该环境只需编译一组 .java
文件并将它们放入可执行 jar 或只是将它们作为 .class
文件放在单独的 bin
文件夹或其他文件夹中。如果您解释每个部分在做什么以及我如何进行更改以添加更多内容(例如基本依赖项,可能在 .jar
周围添加 .exe
包装器等),这也会有所帮助
让我们从一个简单的问题开始:构建一个Java项目需要哪些基本步骤?好吧,只要您的项目没有使用一些花哨的预处理或代码生成,第一步可能就是将 .java
个文件编译为 .class
个文件。这些 .class
文件(和资源,如果提供的话)可能会被打包到 .jar
文件中。现在对您来说可能并不明显,但一般来说,您还应该在构建项目时进行 运行(单元)测试。根据您的项目,可能还有更多可能的步骤(例如发布、文档、质量控制)。
在Gradle中,这些步骤称为任务。任务基本上可以做任何有助于您构建软件的事情。这通常意味着任务需要一些输入文件并将它们转换为一些输出文件。例如,编译任务 将 .java
个文件转换为 .class
个文件。另一个任务可以将 .class
个文件转换为 .jar
个文件(我们称此任务为 jar 任务 )。由于需要创建 .class
文件以将它们放入 .jar
文件中,因此 jar 任务 取决于 编译任务。你可以使用Gradle来表达这种关系,所以每次jar任务运行s,Gradle都会确保编译task 预先有 运行。任务不需要做某事,它们可能只是用来表达这种关系(这样的任务称为生命周期任务)。您可以创建特定 任务类型 的任务以重用功能,例如,可以使用两个不同的任务来编译生产代码和测试代码,但两者都在内部使用编译器并仅在一组不同的输入文件。
您可以手动创建任务,我绝对鼓励您创建一些任务以了解它们的关系和执行方式,但通常您不需要在构建脚本中创建任务,因为所有必要的任务都已完成由 plugins 创建。 Gradle 插件真的很强大,因为它们基本上可以完成您可以在构建脚本中手动执行的所有操作,并且 there is a plugin for almost everything 您可能想在构建过程中执行的操作。
[...] I am asking if someone can explain the steps to take to make a simple gradle environment that simply compiles a set of .java files [...]
使用 Gradle 编译 Java 项目的最简单方法是创建一个包含以下内容的文件 build.gradle
:
plugins {
id 'java'
}
就是这样! Gradle 已准备好构建您的项目(只是 运行 gradle build
)。这怎么可能?好吧,Java 插件创建所有必要的任务来编译、测试和打包您的项目,并配置它们以遵循通用约定。看看 documentation of the Java plugin,它甚至包含一张显示所有任务及其依赖关系的漂亮图像。如图所示,build
任务依赖于所有其他任务。当您调用 gradle build
时执行此任务。您也可以调用 gradle jar
或 gradle assemble
并且 Gradle 将仅 运行 构建 .jar
文件所需的任务。
[...] it seemed to assume that you were following some specific system for the layout of your project.
是的,Gradle 遵循一种称为约定优于配置 的方法。这意味着对于所有必须手动配置的内容都有一个(某种程度上常见或有用的)约定。
此方法的一个简单示例是预期源文件和资源文件所在的位置。如您所见,此位置未在上面的构建脚本中配置。但是,有一个约定(由 Maven 建立),.java
源文件应该进入 src/main/java
用于生产代码,src/test/java
用于测试代码。当然,这些路径可能会更改,但在大多数项目中,您应该只遵循约定。
It would also be helpful if you explained what each part was doing and how I can make changes to add more stuff (like basic dependencies [...])
让我们简单地看一下您教程中的构建文件:
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()
or google()
,但也可以添加可在自定义 URL 下访问的存储库。
最后一部分应用了必要的配置,因为无法应用有用的约定。 Gradle根本不知道你项目中的哪个class应该作为你应用的主要class,所以你必须手动定义它。
现在,多亏了 Application 插件,您不仅可以使用 gradle build
构建您的项目,还可以使用 gradle run
从 Gradle 运行 您的应用程序,因为任务 run
是在 Java 插件创建的任务之上创建的任务之一。
我正在尝试学习如何使用 gradle 来简化我的 java 程序的编译和打包。我已经有 java 编程经验,通常我只使用 eclipse 来管理它,或者,我只是手动编译我的程序(在终端中使用 javac)。但是,我已经到了想要使用似乎最容易使用和维护的库 gradle.
的地步为了进一步了解 gradle 的工作原理,我访问了 gradle 网站,那里有制作简单 gradle 设置的教程,以便在编写 java 应用程序(this 是我找到的那个)。然而,本教程并没有真正解释这些是如何工作的,而且它似乎假设您正在遵循一些特定的项目布局系统。它还包括一些测试程序或在您构建程序时测试您的程序的东西。除了这些东西之外,它从未真正解释过 运行 gradle 构建函数是如何工作的,或者文件在哪里(以及什么)保存了你构建程序时它正在做什么的指令。
所以本质上,我想问的是是否有人可以解释制作简单 gradle 环境的步骤,该环境只需编译一组 .java
文件并将它们放入可执行 jar 或只是将它们作为 .class
文件放在单独的 bin
文件夹或其他文件夹中。如果您解释每个部分在做什么以及我如何进行更改以添加更多内容(例如基本依赖项,可能在 .jar
周围添加 .exe
包装器等),这也会有所帮助
让我们从一个简单的问题开始:构建一个Java项目需要哪些基本步骤?好吧,只要您的项目没有使用一些花哨的预处理或代码生成,第一步可能就是将 .java
个文件编译为 .class
个文件。这些 .class
文件(和资源,如果提供的话)可能会被打包到 .jar
文件中。现在对您来说可能并不明显,但一般来说,您还应该在构建项目时进行 运行(单元)测试。根据您的项目,可能还有更多可能的步骤(例如发布、文档、质量控制)。
在Gradle中,这些步骤称为任务。任务基本上可以做任何有助于您构建软件的事情。这通常意味着任务需要一些输入文件并将它们转换为一些输出文件。例如,编译任务 将 .java
个文件转换为 .class
个文件。另一个任务可以将 .class
个文件转换为 .jar
个文件(我们称此任务为 jar 任务 )。由于需要创建 .class
文件以将它们放入 .jar
文件中,因此 jar 任务 取决于 编译任务。你可以使用Gradle来表达这种关系,所以每次jar任务运行s,Gradle都会确保编译task 预先有 运行。任务不需要做某事,它们可能只是用来表达这种关系(这样的任务称为生命周期任务)。您可以创建特定 任务类型 的任务以重用功能,例如,可以使用两个不同的任务来编译生产代码和测试代码,但两者都在内部使用编译器并仅在一组不同的输入文件。
您可以手动创建任务,我绝对鼓励您创建一些任务以了解它们的关系和执行方式,但通常您不需要在构建脚本中创建任务,因为所有必要的任务都已完成由 plugins 创建。 Gradle 插件真的很强大,因为它们基本上可以完成您可以在构建脚本中手动执行的所有操作,并且 there is a plugin for almost everything 您可能想在构建过程中执行的操作。
[...] I am asking if someone can explain the steps to take to make a simple gradle environment that simply compiles a set of .java files [...]
使用 Gradle 编译 Java 项目的最简单方法是创建一个包含以下内容的文件 build.gradle
:
plugins {
id 'java'
}
就是这样! Gradle 已准备好构建您的项目(只是 运行 gradle build
)。这怎么可能?好吧,Java 插件创建所有必要的任务来编译、测试和打包您的项目,并配置它们以遵循通用约定。看看 documentation of the Java plugin,它甚至包含一张显示所有任务及其依赖关系的漂亮图像。如图所示,build
任务依赖于所有其他任务。当您调用 gradle build
时执行此任务。您也可以调用 gradle jar
或 gradle assemble
并且 Gradle 将仅 运行 构建 .jar
文件所需的任务。
[...] it seemed to assume that you were following some specific system for the layout of your project.
是的,Gradle 遵循一种称为约定优于配置 的方法。这意味着对于所有必须手动配置的内容都有一个(某种程度上常见或有用的)约定。
此方法的一个简单示例是预期源文件和资源文件所在的位置。如您所见,此位置未在上面的构建脚本中配置。但是,有一个约定(由 Maven 建立),.java
源文件应该进入 src/main/java
用于生产代码,src/test/java
用于测试代码。当然,这些路径可能会更改,但在大多数项目中,您应该只遵循约定。
It would also be helpful if you explained what each part was doing and how I can make changes to add more stuff (like basic dependencies [...])
让我们简单地看一下您教程中的构建文件:
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()
or google()
,但也可以添加可在自定义 URL 下访问的存储库。
最后一部分应用了必要的配置,因为无法应用有用的约定。 Gradle根本不知道你项目中的哪个class应该作为你应用的主要class,所以你必须手动定义它。
现在,多亏了 Application 插件,您不仅可以使用 gradle build
构建您的项目,还可以使用 gradle run
从 Gradle 运行 您的应用程序,因为任务 run
是在 Java 插件创建的任务之上创建的任务之一。