项目初始化

初始化项目

init 初始化

Gradle 有一个内置的任务,叫做 init,可以在一个空的文件夹中初始化一个新的 Gradle 项目。init 任务使用(也是内置的)wrapper 任务来创建一个 Gradle 包装脚本,即 gradlew。

$ mkdir demo
$ cd demo

在新项目目录下,在终端使用以下命令运行 init 任务:gradle init。当提示时,选择2:应用程序项目类型和3:Java作为实现语言。接下来你可以选择用于编写构建脚本的 DSL - 1: Groovy2: Kotlin。对于其他问题,按回车键,使用默认值。

$ gradle init

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit 4) [1..4]

Project name (default: demo):
Source package (default: demo):


BUILD SUCCESSFUL
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

其中,settings.gradle(.kts) 文件有两行有趣的内容。

  • rootProject.name为构建指定了一个名称,它覆盖了以构建所在的目录命名的默认行为。建议设置一个固定的名字,因为如果项目是共享的–例如作为 Git 仓库的根目录,文件夹可能会改变。

  • include("app")定义构建由一个名为app的子项目组成,包含实际的代码和构建逻辑。更多的子项目可以通过额外的`include(..)‘语句添加。

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

plugins {
    id 'application'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'

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

application {
    mainClass = 'demo.App'
}

tasks.named('test') {
    useJUnitPlatform()
}

运行与打包

src/main/java/demo/App.java 内容如下:

package demo;

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

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

// 对应的测试文件如下
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");
    }
}

多亏了 application 插件,你可以直接从命令行运行应用程序。运行任务告诉 Gradle 执行分配给 mainClass 属性的类中的主方法。

$ ./gradlew run

> Task :app:run
Hello world!

BUILD SUCCESSFUL
2 actionable tasks: 2 executed

第一次运行包装脚本 gradlew 时,可能会有延迟,因为该版本的 gradle 被下载并存储在本地的~/.gradle/wrapper/dists 文件夹中。该 application 插件还为你捆绑了应用程序及其所有的依赖性。归档文件还将包含一个脚本,可以用一个命令启动应用程序。

$ ./gradlew build

BUILD SUCCESSFUL in 0s
7 actionable tasks: 7 executed

如果你如上所示运行一个完整的构建,Gradle 将为你生成两种格式的存档。app/build/distributions/app.tarapp/build/distributions/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
上一页