Skip to content

构建 Java 控制台应用

本示例演示如何从零开始用 Gradle 构建一个完整的 Java 控制台应用程序。

项目初始化

bash
mkdir java-console-app
cd java-console-app

gradle init \
  --type java-application \
  --dsl kotlin \
  --test-framework junit-jupiter \
  --package com.example \
  --project-name java-console-app \
  --no-incubating

项目结构

java-console-app/
├── app/
│   ├── build.gradle.kts
│   └── src/
│       ├── main/java/com/example/
│       │   └── App.java
│       └── test/java/com/example/
│           └── AppTest.java
├── gradle/
│   ├── libs.versions.toml
│   └── wrapper/...
├── settings.gradle.kts
├── gradlew
└── gradlew.bat

settings.gradle.kts

kotlin
rootProject.name = "java-console-app"
include("app")

gradle/libs.versions.toml

toml
[versions]
guava = "32.0.1-jre"
junit-jupiter = "5.10.1"

[libraries]
guava = { module = "com.google.guava:guava", version.ref = "guava" }
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" }
junit-launcher = { module = "org.junit.platform:junit-platform-launcher" }

[plugins]

app/build.gradle.kts

kotlin
plugins {
    application
}

group = "com.example"
version = "1.0.0"

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

repositories {
    mavenCentral()
}

application {
    mainClass.set("com.example.App")
}

dependencies {
    implementation(libs.guava)
    testImplementation(libs.junit.jupiter)
    testRuntimeOnly(libs.junit.launcher)
}

tasks.withType<JavaCompile> {
    options.encoding = "UTF-8"
}

tasks.named<Test>("test") {
    useJUnitPlatform()
    testLogging {
        events("passed", "skipped", "failed")
    }
}

源码示例

java
// src/main/java/com/example/App.java
package com.example;

import com.google.common.collect.ImmutableList;

public class App {
    private final String message;
    
    public App(String message) {
        this.message = message;
    }
    
    public String getMessage() {
        return message;
    }
    
    public static void main(String[] args) {
        App app = new App("Hello, Gradle!");
        System.out.println(app.getMessage());
        
        ImmutableList<String> items = ImmutableList.of("one", "two", "three");
        items.forEach(System.out::println);
    }
}
java
// src/test/java/com/example/AppTest.java
package com.example;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test
    void getMessage_returnsCorrectMessage() {
        App app = new App("Hello");
        assertEquals("Hello", app.getMessage());
    }
    
    @Test
    void getMessage_notEmpty() {
        App app = new App("Test");
        assertFalse(app.getMessage().isEmpty());
    }
}

构建与运行

bash
# 运行
./gradlew run

# 测试
./gradlew test

# 打包
./gradlew jar
java -jar app/build/libs/app-1.0.0.jar

# 生成发行版(带启动脚本)
./gradlew installDist
./app/build/install/app/bin/app

增量构建验证

bash
# 第一次构建
./gradlew build
# 8 actionable tasks: 8 executed

# 不修改任何文件,再次构建
./gradlew build
# 8 actionable tasks: 8 up-to-date  ← 全部跳过!

# 修改 App.java 后
./gradlew build
# 8 actionable tasks: 4 executed, 4 up-to-date