什么是Gradle
Gradle 是一个功能强大且灵活的构建工具,被广泛用于各种类型的项目,包括Java、Android、Kotlin、Groovy等。它提供了一种简洁而强大的方式来管理项目的构建过程,并帮助开发人员提高开发效率。本篇将深入解读官网提供的示例:Gradle构建Java应用程序示例。
-
官网:https://gradle.org/ -
Gradle构建Java应用程序示例:https://docs.gradle.org/current/samples/sample_building_java_applications.html
先决条件
安装Java JDK版本 8 或更高版本,此处下载和安装:https://adoptium.net/zh-CN/temurin/releases/
安装gradle
请参考文档:https://gradle.org/install/
创建项目demo
第一步是为新项目创建一个文件夹并将目录更改为该文件夹。
tantianran@java-dev:~/javaProject$ mkdir demo
tantianran@java-dev:~/javaProject$ cd demo/
tantianran@java-dev:~/javaProject/demo$
运行初始化任务
-
Gradle会提示选择要生成的项目类型
tantianran@java-dev:~/javaProject/demo$ gradle init
Starting a Gradle Daemon (subsequent builds will be faster)
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2
可以在终端中看到以下选项:
-
basic(基础):生成一个基本的Gradle项目。 -
application(应用程序):生成一个用于构建应用程序的Gradle项目。 -
library(库):生成一个用于构建库(library)的Gradle项目。 -
Gradle plugin(Gradle插件):生成一个用于构建Gradle插件的Gradle项目。
-
Gradle会提示选择要使用的实现语言
Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 3
可以在终端中看到以下选项:
-
C++:选择C++作为实现语言。 -
Groovy:选择Groovy作为实现语言。 -
Java:选择Java作为实现语言。 -
Kotlin:选择Kotlin作为实现语言。 -
Scala:选择Scala作为实现语言。 -
Swift:选择Swift作为实现语言。
-
Gradle会进一步询问是否要为应用程序生成多个子项目
Generate multiple subprojects for application? (default: no) [yes, no] no
-
“yes”:选择此选项将生成多个子项目。你可以在后续的提示中输入子项目的名称。 -
“no”:选择此选项将不生成子项目,只创建单个应用程序项目。
-
Gradle会询问你选择构建脚本的DSL(Domain Specific Language)。
Select build script DSL:
1: Kotlin
2: Groovy
Enter selection (default: Kotlin) [1..2] 2
Gradle支持使用不同的DSL编写构建脚本,用于定义项目的构建配置和任务。在这一步中,可以选择以下选项:
-
Kotlin:选择使用Kotlin作为构建脚本的DSL。Kotlin DSL提供了一种类型安全、表达力强大的编程语言来编写Gradle构建脚本。 -
Groovy:选择使用Groovy作为构建脚本的DSL。Groovy DSL是Gradle的默认和传统的构建脚本语言。
-
Gradle会询问选择测试框架
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4]
测试框架是用于编写和执行单元测试的工具。在这一步中,可以选择以下选项:
-
JUnit 4:选择使用JUnit 4作为测试框架。JUnit 4是一个广泛使用的Java单元测试框架。 -
TestNG:选择使用TestNG作为测试框架。TestNG是一个功能强大且灵活的Java测试框架,支持更多的测试配置选项。 -
Spock:选择使用Spock作为测试框架。Spock是一个基于Groovy的JVM测试框架,具有清晰的语法和强大的功能。 -
JUnit Jupiter:选择使用JUnit Jupiter作为测试框架。JUnit Jupiter是JUnit 5的一部分,提供了现代化的、模块化的测试框架。
需要输入对应选项的数字,按Enter键确认选择。如果不输入任何内容,系统会默认选择”JUnit Jupiter”选项。此处,我保持默认,直接回车。
-
Gradle会询问输入项目名称
Project name (default: demo):
可以输入想要的项目名称,或者直接按Enter键使用默认的项目名称。如果不输入任何内容,系统会默认使用”demo”作为项目名称。此处,我直接回车。
项目名称是用来标识你的项目的唯一名称,它将成为项目的根目录名称和一些默认配置的一部分。
-
Gradle会询问输入源代码包的名称
Source package (default: demo):
可以输入想要的源代码包名称,或者直接按Enter键使用默认的包名称。如果不输入任何内容,系统会默认使用”demo”作为源代码包名称。此处,我直接回车。
源代码包是用来组织项目源代码的目录结构,它通常是根据项目名称或领域来命名的。
-
Gradle会询问输入目标Java版本
Enter target version of Java (min. 7) (default: 18):
可以输入希望的目标Java版本,或者直接按Enter键使用默认的版本。如果不输入任何内容,系统会默认使用”18″作为目标Java版本。此处,我直接回车。
目标Java版本是希望项目所针对的最低Java版本。Gradle将会根据这个配置来确定编译代码和设置其他与Java版本相关的构建配置。
-
Gradle会询问是否要使用新的API和行为生成构建文件
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
Gradle在每个版本中都会引入新的API和功能,以改进构建过程和开发体验。然而,这些新的API和功能可能会在下一个次要版本中发生变化。此处,我直接回车。
Gradle提供了以下选项:
-
“yes”:选择此选项将使用新的API和行为生成构建文件。这意味着你可以尝试最新的功能和改进,但也可能需要在未来的版本中更新构建文件以适应可能的变化。 -
“no”:选择此选项将不使用新的API和行为生成构建文件。你将使用当前稳定的API和行为进行构建,以确保构建文件的兼容性和稳定性。
-
最后,Gradle成功执行了init任务
> Task :init
To learn more about Gradle by exploring our Samples at https://docs.gradle.org/8.2/samples/sample_building_java_applications.html
BUILD SUCCESSFUL in 22m 59s
2 actionable tasks: 2 executed
输出中提到了一个URL链接:
-
https://docs.gradle.org/8.2/samples/sample_building_java_applications.html
它建议我们通过访问这个链接来探索Gradle的示例项目,以便更深入地了解Gradle的使用。
到此为止,Gradle已成功初始化项目,并在构建过程中执行了相应的任务。接下来,就可以继续进行后续的项目开发和构建操作了。
解读项目目录结构
该init任务生成具有以下结构的新项目
tantianran@java-dev:~/javaProject/demo$ tree
.
├── app
│ ├── build.gradle
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── demo
│ │ │ └── App.java
│ │ └── resources
│ └── test
│ ├── java
│ │ └── demo
│ │ └── AppTest.java
│ └── resources
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
12 directories, 8 files
tantianran@java-dev:~/javaProject/demo$
逐个说明:
-
app目录包含了项目的主要源代码和资源文件。 在src/main/java目录下,你可以找到demo包,其中包含了一个名为App.java的主应用程序类。在src/main/resources目录下,你可以放置应用程序所需的资源文件。
-
app目录下的src/test目录包含了测试相关的源代码和资源文件。在src/test/java目录下,你可以找到demo包,其中包含了一个名为AppTest.java的测试类。在src/test/resources目录下,你可以放置测试所需的资源文件。
-
gradle目录包含了Gradle的一些配置文件和依赖管理相关的文件。
-
gradlew和gradlew.bat是Gradle的包装器脚本,用于在项目中执行Gradle构建,而无需预先安装Gradle。
-
settings.gradle是Gradle项目的设置文件,其中包含了项目的配置和模块的定义。
这个目录结构提供了一个标准的Gradle Java项目的组织方式,以及构建和测试代码所需的相关文件和目录。你可以在这个基础上继续开发和构建你的Java应用程序。
解读基本的文件
settings.gradle
plugins {
// Apply the foojay-resolver plugin to allow automatic download of JDKs
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.4.0'
}
rootProject.name = 'demo'
include('app')
Gradle会自动生成settings.gradle文件内容,该文件用于指定要包含在构建中的项目。
在这个文件中,有一个插件声明部分,使用了org.gradle.toolchains.foojay-resolver-convention插件,并指定了版本为0.4.0。这个插件允许自动下载JDK(Java Development Kit)。
接下来,rootProject.name指定了根项目的名称为demo。然后,使用include语句包含了一个名为app的子项目。
这个settings.gradle文件的作用是定义Gradle构建中的项目结构和配置。你可以根据项目需求,修改或添加适当的内容。详细的多项目构建信息可以参考Gradle文档中的https://docs.gradle.org/8.2/userguide/building_swift_projects.html。
app/build.gradle
build.gradle文件,它是由Gradle的init任务自动生成的。
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
// Use JUnit Jupiter for testing.
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
// This dependency is used by the application.
implementation 'com.google.guava:guava:31.1-jre'
}
// Apply a specific Java toolchain to ease working on different environments.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(18)
}
}
application {
// Define the main class for the application.
mainClass = 'demo.App'
}
tasks.named('test') {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
build.gradle文件展示了一个用于构建Java应用程序的配置。
逐行解释一下:
-
plugins块中应用了application插件,该插件提供了构建Java命令行应用程序所需的功能和支持。
-
repositories块中声明使用Maven Central仓库来解析依赖项。
-
dependencies块中声明了项目的依赖项。在这个示例中,使用了JUnit Jupiter进行测试,并且使用了Guava库作为应用程序的依赖。
-
java块中应用了特定的Java工具链,以方便在不同环境中进行开发。在这个示例中,指定了Java语言版本为18。
-
application块用于定义应用程序的主类。
-
tasks.named(‘test’)块中使用JUnit Platform来执行单元测试。
这个示例build.gradle文件提供了一个起点,用于构建一个Java应用程序,并配置了测试和依赖项等方面的设置。可以根据实际需求修改和扩展这个文件。有关更多详细的Java和JVM项目构建信息,请参考Gradle文档中的https://docs.gradle.org/8.2/userguide/building_java_projects.html。
./demo/app/src/main/java/demo/App.java
这是一个简单的Java应用程序示例,包含一个名为App的类。
package demo;
public class App {
public String getGreeting() {
return "Hello World!";
}
public static void main(String[] args) {
System.out.println(new App().getGreeting());
}
}
这个示例的App类包含了一个getGreeting方法,用于返回一个问候语字符串”Hello World!”。main方法是程序的入口点,通过创建App对象并调用getGreeting方法,然后将结果打印到控制台。
这个示例可以作为一个简单的Java应用程序的起点,以后可以在此基础上进行进一步的开发和扩展。
./demo/app/src/test/java/demo/AppTest.java
这是一个使用JUnit Jupiter编写的简单的单元测试示例,针对之前提供的App类。
package demo;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class AppTest {
@Test void appHasAGreeting() {
App classUnderTest = new App();
assertNotNull(classUnderTest.getGreeting(), "app should have a greeting");
}
}
这个示例的AppTest类使用了JUnit Jupiter的注解@Test来标记测试方法。其中,appHasAGreeting方法测试了App类的getGreeting方法是否返回非空的问候语字符串。在测试方法中,创建了一个App类的实例,并使用assertNotNull断言来验证获取的问候语是否为非空。
这个示例可以作为一个简单的单元测试的起点,以后可以在此基础上编写更多的测试方法,来验证App类的其他行为和功能。
开始运行应用程序
tantianran@java-dev:~/javaProject/demo$ ./gradlew run
> Task :app:run
Hello World!
BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
tantianran@java-dev:~/javaProject/demo$
-
./gradlew是Gradle的包装器脚本,用于在项目中执行Gradle构建任务,而无需预先安装Gradle本身。
-
run任务是由application插件提供的,它用于运行Java应用程序。在这个示例中,通过执行./gradlew run命令,成功运行了应用程序,并输出了”Hello World!”。
进展到这里,这表明我的Java应用程序已经成功运行,并且输出了期望的结果。可以继续使用Gradle构建工具来进行更多的项目开发和构建操作。
构建整个项目
通过运行./gradlew build命令,执行构建过程。build任务是用于构建整个项目的任务,它会编译源代码、运行测试、生成构建产物等。
tantianran@java-dev:~/javaProject/demo$ ./gradlew build
BUILD SUCCESSFUL in 1s
7 actionable tasks: 6 executed, 1 up-to-date
tantianran@java-dev:~/javaProject/demo$
在Gradle构建成功后,生成的构建产物通常位于项目目录下的build目录中,我的相对路径是 app/build
具体的构建位置可能因项目配置而有所不同,以下是一些常见的构建产物目录:
-
build/libs:如果你的项目生成了可执行的JAR文件,那么它们通常位于这个目录下。 -
build/classes:编译后的类文件通常存放在这个目录下,按照源代码的包结构进行组织。 -
build/reports:测试报告和其他构建报告通常位于这个目录下。
发布构建扫描
通过运行./gradlew build –scan命令,生成构建扫描报告,并将其上传到Gradle的构建扫描服务,在输出中提供了一个URL链接,可以点击链接访问该构建扫描报告。
tantianran@java-dev:~/javaProject/demo$ ./gradlew build --scan
BUILD SUCCESSFUL in 643ms
7 actionable tasks: 7 up-to-date
Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no] yes
Gradle Terms of Service accepted.
Publishing build scan...
https://gradle.com/s/mayhst7xce4ag
tantianran@java-dev:~/javaProject/demo$
将构建扫描报告上传到Gradle的构建扫描服务有以下几个作用:
1. 提供详细的构建信息: 构建扫描报告包含了构建过程的详细信息,包括构建配置、依赖项、任务执行、测试结果等。通过构建扫描报告,你可以深入了解构建的各个方面,从构建配置到任务执行的细节,以及测试的结果。
2. 支持共享和协作: 通过上传构建扫描报告到Gradle的构建扫描服务,你可以生成一个唯一的URL链接,用于共享和传递构建的详细信息给团队成员、合作伙伴或其他人员。这样可以方便地与他人分享构建结果,讨论和解决问题,以及进行协作开发。
3. 提供性能优化建议: 构建扫描服务能够分析构建过程中的性能指标,并提供相应的优化建议。通过查看构建扫描报告中的性能数据和建议,你可以识别构建过程中的性能瓶颈,并进行相应的调整和优化,以提高构建的效率和速度。
4. 持续改进和监控: 通过定期生成构建扫描报告并上传到构建扫描服务,你可以建立一个持续改进和监控的机制。通过跟踪构建的历史记录和性能指标,你可以了解构建过程的变化和趋势,并进行相应的优化和调整,以确保构建过程的稳定性和可靠性。
生成了构建扫描报告,并将其上传到Gradle的构建扫描服务。有什么作用?简而言之,上传构建扫描报告到Gradle的构建扫描服务可以提供更全面的构建信息和性能分析,帮助我们更好地了解和优化项目的构建过程。通过与团队成员共享报告和借助构建扫描服务的分析功能,可以进行更好的团队协作和持续改进。
最后的总结
到此为止,已经成功配置和构建了一个Java应用程序项目,通过本篇,你应该学会了以下关键步骤:
-
初始化项目:使用Gradle的init任务来初始化一个Java应用程序项目。 -
运行构建:通过运行./gradlew build命令,执行项目的构建过程,并生成构建产物。 -
查看测试报告:通过运行测试任务,生成测试报告并查看测试结果。 -
运行Java应用程序:使用Gradle的application插件提供的run任务来执行Java应用程序。 -
打包应用程序:通过运行构建任务生成一个可执行的JAR文件,以便将应用程序打包和部署到其他环境中。
通过掌握这些关键步骤,相信你已经掌握了使用Gradle构建和管理Java应用程序的基本技能。以后可以进一步探索Gradle的功能和插件,以满足更复杂的项目需求,并加深对构建和部署流程的理解。
下一步
要了解有关如何进一步自定义 Java 应用程序项目的更多信息,请查看以下用户手册章节:
-
构建 Java 和 JVM 项目:https://docs.gradle.org/current/userguide/building_java_projects.html -
Java 应用程序插件文档:https://docs.gradle.org/current/userguide/application_plugin.html
原文始发于微信公众号(不背锅运维):深入解读Gradle构建Java应用程序示例
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/149381.html