深入解读Gradle构建Java应用程序示例

什么是Gradle

Gradle 是一个功能强大且灵活的构建工具,被广泛用于各种类型的项目,包括JavaAndroid、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$

运行初始化任务

  1. 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项目。
  1. 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作为实现语言。
  1. Gradle会进一步询问是否要为应用程序生成多个子项目
Generate multiple subprojects for application? (default: no) [yes, no] no
  • “yes”:选择此选项将生成多个子项目。你可以在后续的提示中输入子项目的名称。
  • “no”:选择此选项将不生成子项目,只创建单个应用程序项目。
  1. 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的默认和传统的构建脚本语言。
  1. 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”选项。此处,我保持默认,直接回车。

  1. Gradle会询问输入项目名称
Project name (default: demo):

可以输入想要的项目名称,或者直接按Enter键使用默认的项目名称。如果不输入任何内容,系统会默认使用”demo”作为项目名称。此处,我直接回车。

项目名称是用来标识你的项目的唯一名称,它将成为项目的根目录名称和一些默认配置的一部分。

  1. Gradle会询问输入源代码包的名称
Source package (default: demo):

可以输入想要的源代码包名称,或者直接按Enter键使用默认的包名称。如果不输入任何内容,系统会默认使用”demo”作为源代码包名称。此处,我直接回车。

源代码包是用来组织项目源代码的目录结构,它通常是根据项目名称或领域来命名的。

  1. Gradle会询问输入目标Java版本
Enter target version of Java (min. 7) (default: 18):

可以输入希望的目标Java版本,或者直接按Enter键使用默认的版本。如果不输入任何内容,系统会默认使用”18″作为目标Java版本。此处,我直接回车。

目标Java版本是希望项目所针对的最低Java版本。Gradle将会根据这个配置来确定编译代码和设置其他与Java版本相关的构建配置。

  1. 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和行为进行构建,以确保构建文件的兼容性和稳定性。
  1. 最后,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应用程序项目,通过本篇,你应该学会了以下关键步骤:

  1. 初始化项目:使用Gradle的init任务来初始化一个Java应用程序项目。
  2. 运行构建:通过运行./gradlew build命令,执行项目的构建过程,并生成构建产物。
  3. 查看测试报告:通过运行测试任务,生成测试报告并查看测试结果。
  4. 运行Java应用程序:使用Gradle的application插件提供的run任务来执行Java应用程序。
  5. 打包应用程序:通过运行构建任务生成一个可执行的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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!