我正在努力学习如何使用gradle来简化java程序的编译和打包。我已经有java编程的经验,通常我只是使用eclipse来管理它,或者,我只是手动编译我的程序(在终端中使用javac)。然而,我已经到了想使用gradle最容易使用和维护的库的地步。
为了更多地了解gradle的工作原理,我访问了gradle网站,那里有一些教程,用于编写java应用程序时使用的简单gradle设置(这就是我找到的)。然而,本教程并没有真正解释这其中的任何一个应该是如何工作的,它似乎假设您正在遵循某个特定的系统来进行项目的布局。它还包括一些测试程序,或者在构建程序时测试程序的东西。除此之外,它从未真正解释过运行gradle build函数是如何工作的,也没有解释过在哪里(以及什么)文件保存了构建程序时它所做的操作的指令。
所以从本质上说,我想问的是,是否有人能解释一下创建一个简单的gradle环境的步骤,这个环境只需编译一组 .java
文件并将其放入可执行jar中,或将其作为 .class
文件在单独的 bin
文件夹之类的。如果你解释一下每个部分都在做什么,以及我如何进行更改来添加更多的东西(比如基本的依赖关系,也许是添加 .exe
Package 机周围 .jar
等)
1条答案
按热度按时间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
包括以下内容:就这样!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
测试代码。当然,这些路径可能会改变,但是在大多数项目中,您应该简单地遵守约定。如果您解释一下每个部分都在做什么,以及如何进行更改以添加更多内容(如基本依赖项[…]),也会很有帮助
让我们简单地看一下教程中的构建文件:
第一个块类似于上面的示例,但不是带有标识符的插件
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插件创建的任务之上创建的任务之一。