项目初始化
初始化项目
init 初始化
Gradle 有一个内置的任务,叫做 init,可以在一个空的文件夹中初始化一个新的 Gradle 项目。init 任务使用(也是内置的)wrapper 任务来创建一个 Gradle 包装脚本,即 gradlew。
$ mkdir demo
$ cd demo
在新项目目录下,在终端使用以下命令运行 init 任务:gradle init
。当提示时,选择2:应用程序
项目类型和3:Java
作为实现语言。接下来你可以选择用于编写构建脚本的 DSL - 1: Groovy
或2: 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.tar
和app/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