Contents

Gradle构建Java应用程序

1. 概述

本教程提供了有关如何使用 Gradle 构建基于 Java 的项目的实用指南

我们将解释手动创建项目结构、执行初始配置以及添加 Java 插件和 JUnit 依赖项的步骤。然后,我们将构建并运行应用程序。

最后,在最后一节中,我们将举例说明如何使用 Gradle Build Init 插件执行此操作。一些基本的介绍也可以在Gradle 简介 一文中找到。

2.Java项目结构

在我们手动创建 Java 项目并准备构建之前,我们需要安装 Gradle

让我们开始使用名为gradle-employee-app的 PowerShell 控制台创建一个项目文件夹:

> mkdir gradle-employee-app

之后,让我们导航到项目文件夹并创建子文件夹:

> mkdir src/main/java/employee

结果输出如下所示:

Directory: D:\gradle-employee-app\src\main\java
## Mode                LastWriteTime         Length Name
d-----        4/10/2020  12:14 PM                employee

在上面的项目结构中,让我们创建两个类。一个是简单的Employee类,其中包含姓名、电子邮件地址和出生年份等数据:

public class Employee {
    String name;
    String emailAddress;
    int yearOfBirth;
}

第二个是打印Employee数据的主要EmployeeApp类:

public class EmployeeApp {
    public static void main(String[] args){
        Employee employee = new Employee();
        employee.name = "John";
        employee.emailAddress = "john@example.com";
        employee.yearOfBirth = 1978;
        System.out.println("Name: " + employee.name);
        System.out.println("Email Address: " + employee.emailAddress);
        System.out.println("Year Of Birth:" + employee.yearOfBirth);
    }
}

3. 构建 Java 项目

接下来,为了构建我们的 Java 项目,我们在项目根文件夹中创建一个build.gradle配置文件。

以下是 PowerShell 命令行中的内容:

Echo > build.gradle

我们跳过与输入参数相关的下一步:

cmdlet Write-Output at command pipeline position 1
Supply values for the following parameters:
InputObject[0]:

为了构建成功,我们需要添加 Application Plugin

plugins {
    id 'application'
}

然后,我们应用应用程序插件并添加主类的完全限定名称

apply plugin: 'application'
mainClassName = 'employee.EmployeeApp'

每个项目都由task组成。任务代表构建执行的一项工作,例如编译源代码。

例如,我们可以在配置文件中添加一个任务,打印关于已完成项目配置的消息:

println 'This is executed during configuration phase'
task configured {
    println 'The project is configured'
}

通常,gradle build是主要任务,也是最常用的任务。此任务编译、测试并将代码组装成 JAR 文件。通过键入以下内容开始构建:

> gradle build

执行上面的命令输出:

> Configure project :
This is executed during configuration phase
The project is configured
BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 up-to-date

要查看构建结果,让我们查看包含子文件夹的构建文件夹:classes、distributions、libs 和 reports。键入Tree / F给出构建文件夹的结构:

├───build
   ├───classes
      └───java
          ├───main
             └───employee
                     Employee.class
                     EmployeeApp.class
          
          └───test
              └───employee
                      EmployeeAppTest.class
   
   ├───distributions
          gradle-employee-app.tar
          gradle-employee-app.zip
       
   ├───libs
          gradle-employee-app.jar
   
   ├───reports
      └───tests
          └───test
                 index.html
              
              ├───classes
                     employee.EmployeeAppTest.html

如您所见,classes子文件夹包含我们之前创建的两个已编译的*.class文件。distributions子文件夹包含应用程序 jar 包的存档版本。而libs*保存了我们应用程序的 jar 文件。

通常,在reports中,运行JUnit测试时会生成一些文件。

现在一切准备就绪,可以通过键入gradle run 来运行 Java 项目。退出时执行应用程序的结果:

> Configure project :
This is executed during configuration phase
The project is configured
> Task :run
Name: John
Email Address: john@example.com
Year Of Birth:1978
BUILD SUCCESSFUL in 1s
2 actionable tasks: 1 executed, 1 up-to-date

3.1.使用 Gradle Wrapper 构建

Gradle Wrapper 是一个调用已声明版本的 Gradle 的脚本

首先,让我们在build.gradle文件中定义一个包装器任务:

task wrapper(type: Wrapper){
    gradleVersion = '5.3.1'
}

让我们使用Power Shell中的gradle wrapper运行此任务:

> Configure project :
This is executed during configuration phase
The project is configured
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

项目文件夹下将创建几个文件,包括*/gradle/wrapper*位置下的文件:

   gradlew
   gradlew.bat
   
├───gradle
   └───wrapper
           gradle-wrapper.jar
           gradle-wrapper.properties
  • gradlew:用于在 Linux 上创建 Gradle 任务的 shell 脚本
  • gradlew.bat:Windows 用户创建 Gradle 任务的*.bat*脚本
  • gradle-wrapper.jar:我们应用程序的包装器可执行 jar
  • gradle-wrapper.properties:用于配置包装器的属性文件

4. 添加Java依赖并运行一个简单的测试

首先,在我们的配置文件中,我们需要设置一个远程存储库,从中下载依赖 jar。大多数情况下,这些存储库是mavenCentral()jcenter()。我们选择第二个:

repositories {
    jcenter()
}

创建存储库后,我们可以指定要下载的依赖项。在此示例中,我们添加了 Apache Commons 和 JUnit 库。要实现,请在依赖项配置中添加testImplementationtestRuntime部分。

它建立在一个额外的测试块上:

dependencies {
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0'
    testImplementation('junit:junit:4.13')
    testRuntime('junit:junit:4.13')
}
test {
    useJUnit()
}

完成后,让我们在一个简单的测试中尝试 JUnit 的工作。导航到src文件夹并为测试创建子文件夹:

src> mkdir test/java/employee

在最后一个子文件夹中,让我们创建EmployeeAppTest.java

public class EmployeeAppTest {
    @Test
    public void testData() {
        Employee testEmp = this.getEmployeeTest();
        assertEquals(testEmp.name, "John");
        assertEquals(testEmp.emailAddress, "john@example.com");
        assertEquals(testEmp.yearOfBirth, 1978);
    }
    private Employee getEmployeeTest() {
        Employee employee = new Employee();
        employee.name = "John";
        employee.emailAddress = "john@example.com";
        employee.yearOfBirth = 1978;
        return employee;
    }
}

与之前类似,让我们从命令行运行gradle clean 测试,测试应该没有问题地通过。

5. 使用 Gradle 初始化 Java 项目

在本节中,我们将解释创建和构建到目前为止我们已经完成的 Java 应用程序的步骤。不同的是,这一次,我们在 Gradle Build Init 插件的帮助下工作。

创建一个新的项目文件夹并将其命名为gradle-java-example。然后,切换到那个空的项目文件夹并运行初始化脚本:

> gradle init

Gradle 会问我们几个问题,并提供创建项目的选项。第一个问题是我们要生成什么类型的项目:

Select type of project to generate:
  1: basic
  2: cpp-application
  3: cpp-library
  4: groovy-application
  5: groovy-library
  6: java-application
  7: java-library
  8: kotlin-application
  9: kotlin-library
  10: scala-library
Select build script DSL:
  1: groovy
  2: kotlin
Enter selection [1..10] 6

为项目类型选择选项 6,然后为构建脚本选择第一个选项 (groovy)

接下来,出现一个问题列表:

Select test framework:
  1: junit
  2: testng
  3: spock
Enter selection (default: junit) [1..3] 1
Project name (default: gradle-java-example):
Source package (default: gradle.java.example): employee
BUILD SUCCESSFUL in 57m 45s
2 actionable tasks: 2 executed

在这里,我们为测试框架选择第一个选项 junit。为我们的项目选择默认名称并输入“employee”作为源包的名称。

要查看*/src项目文件夹中的完整目录结构,让我们在 Power Shell 中键入Tree /F* :

├───main
   ├───java
      └───employee
              App.java
   
   └───resources
└───test
    ├───java
       └───employee
               AppTest.java
    
    └───resources

最后,如果我们使用gradle run 构建项目,我们会在退出时得到*“Hello World”* :

> Task :run
Hello world.
BUILD SUCCESSFUL in 1s
2 actionable tasks: 1 executed, 1 up-to-date