Gradle 命令行构建项目

[toc]

环境

  • 一个文本编辑器或IDE,例如IntelliJ IDEA
  • 一个Java开发工具包(JDK),版本8或更高-例如AdoptOpenJDK
  • 最新的Gradle发行版

创建一个项目文件夹

Gradle自带一个名为init的内置任务,它会在一个空文件夹中初始化一个新的Gradle项目。init任务使用(也是内置的)wrapper任务来创建一个Gradle包装器脚本gradlew。

第一步是为新项目创建一个文件夹,并将目录更改到其中。

  1. $ mkdir demo
  2. $ cd demo

运行初始化任务

在新的项目目录中,使用以下命令在终端中运行init任务:当出现提示时,选择2:application project类型和3:Java作为实现语言。接下来,您可以选择用于编写构建脚本的DSL——1:Groovy或2:Kotlin。对于其他问题,请按“enter”,使用默认值。

输出如下所示:

  1. $ gradle init
  2. Select type of project to generate:
  3. 1: basic
  4. 2: application
  5. 3: library
  6. 4: Gradle plugin
  7. Enter selection (default: basic) [1..4] 2
  8. Select implementation language:
  9. 1: C++
  10. 2: Groovy
  11. 3: Java
  12. 4: Kotlin
  13. 5: Scala
  14. 6: Swift
  15. Enter selection (default: Java) [1..6] 3
  16. Select build script DSL:
  17. 1: Groovy
  18. 2: Kotlin
  19. Enter selection (default: Groovy) [1..2] 1
  20. Select test framework:
  21. 1: JUnit 4
  22. 2: TestNG
  23. 3: Spock
  24. 4: JUnit Jupiter
  25. Enter selection (default: JUnit 4) [1..4]
  26. Project name (default: demo):
  27. Source package (default: demo):
  28. BUILD SUCCESSFUL
  29. 2 actionable tasks: 2 executed

init任务生成的新项目具有如下结构:

├── gradle 
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew 
├── gradlew.bat 
├── settings.gradle 
└── app
    ├── build.gradle 
    └── src
        ├── main
        │   └── java 
        │       └── demo
        │           └── App.java
        └── test
            └── java 
                └── demo
                    └── AppTest.java
  1. gradle 是为包装器文件生成的文件夹
  2. gradlew 和 gradlew.bat 是Gradle包装器启动脚本
  3. settings.gradle 是定义生成名称和子项目的设置文件
  4. build.gradle 是 app 项目的构建脚本
  5. main/java 是默认的 Java 源文件夹
  6. test/java 是默认 Java 测试源文件夹

现在,您已经完成了构建 Java 应用程序的项目设置。

检查项目文件

settings.gradle(.kts)文件有两个活动行:

rootProject.name = 'demo'
include('app')
  • rootProject.name 为构建分配一个名称,这将覆盖以其所在目录命名构建的默认行为。建议设置一个固定的名称,因为如果项目是共享的,文件夹可能会改变——例如作为Git存储库的根目录。
  • include(“app”)定义构建由一个名为app的子项目组成,该子项目包含实际的代码和构建逻辑。更多的子项目可以通过附加的include(…)语句来添加。

我们的构建包含一个名为app的子项目,它代表我们正在构建的Java应用程序。它在app/build.gradle(.kts)文件中配置:

plugins {
    id 'application' 
}

repositories {
    jcenter() 
}

dependencies {
    testImplementation 'junit:junit:4.13' 

    implementation 'com.google.guava:guava:29.0-jre' 
}

application {
    mainClass = 'demo.App' 
}
  1. id ‘application’ - 应用application插件来添加对用 Java 构建 CLI 应用程序的支持
  2. jcenter() - 使用 JCenter 来解析依赖项。
  3. testImplementation ‘junit:junit:4.13’ - 使用 JUnit 测试框架
  4. implementation ‘com.google.guava:guava:29.0-jre’ - 此依赖项由应用程序使用。
  5. mainClass = ‘demo.App’ - 定义应用程序的主类。

src/main/java/demo/App.java文件如下所示:

/*
 * This Java source file was generated by the Gradle 'init' task.
 */
package demo;

public class App {
    public String getGreeting() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}

生成的测试src/test/java/demo/App.java如下所示:

/*
 * This Java source file was generated by the Gradle 'init' task.
 */
package demo;

import org.junit.Test;
import static org.junit.Assert.*;

public class AppTest {
    @Test public void testAppHasAGreeting() {
        App classUnderTest = new App();
        assertNotNull("app should have a greeting", classUnderTest.getGreeting());
    }
}

生成的测试类只有一个JUnit 4测试。测试实例化App类,调用它的一个方法,并检查它是否返回预期的值。

运行应用程序

由于应用程序插件,您可以直接从命令行运行应用程序。run任务告诉Gradle在分配给mainClass属性的类中执行main方法。

$ ./gradlew run

> Task :app:run
Hello world!

BUILD SUCCESSFUL
2 actionable tasks: 2 executed

第一次运行包装器脚本gradlew时,可能会有延迟,因为该版本的gradle被下载并存储在本地~/中。gradle /包装/ dist文件夹。

打包应用程序

应用程序插件还为您打包了应用程序及其所有依赖项。归档文件还将包含一个脚本,用一条命令启动应用程序。

$ ./gradlew build

BUILD SUCCESSFUL in 0s
7 actionable tasks: 7 executed

如果你像上面所示的那样运行一个完整的构建,Gradle会为你生成两种格式的存档:app/build/ distributing /app.tar和app/build/ distributing /app.zip。

发布构建扫描

要更多地了解构建在幕后的工作,最好的方法是发布构建扫描。要做到这一点,只需运行带有——scan标志的Gradle。

$ ./gradlew build --scan

BUILD SUCCESSFUL in 0s
7 actionable tasks: 7 executed

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/5u4w3gxeurtd2

单击该链接,查看执行了哪些任务,下载了哪些依赖项,以及更多细节!