Kotlin: Gradle で使う

## Gradle のバージョン

```text
$ gradle --version

------------------------------------------------------------
Gradle 7.2
------------------------------------------------------------

Build time:   2021-08-17 09:59:03 UTC
Revision:     a773786b58bb28710e3dc96c4d1a7063628952ad

Kotlin:       1.5.21
Groovy:       3.0.8
Ant:          Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM:          16.0.1 (Private Build 16.0.1+9-Ubuntu-120.04)
OS:           Linux 6.2.0-34-generic amd64
```

## プロジェクトの作成

```bash
mkdir ex04
cd ex04
```

```bash
gradle init
```

```text
$ 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] 4

Split functionality across multiple subprojects?:
  1: no - only one application project
  2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1

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

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

> Task :init
Get more help with your project: https://docs.gradle.org/7.2/samples/sample_building_kotlin_applications.html

BUILD SUCCESSFUL in 20s
2 actionable tasks: 2 executed
```

##  Build

```bash
./gradlew build
```

```bash
./gradlew
```

## 実行

```bash
./gradlew run
```

```text
$ ./gradlew run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 474ms
2 actionable tasks: 1 executed, 1 up-to-date
```

## ソースコードの修正

```kt:app/src/main/kotlin/ex04/App.kt
/*
 * This Kotlin source file was generated by the Gradle 'init' task.
 */
package ex04

class App {
    val greeting: String
        get() {
            return "本日は晴天なり!"
        }
}

fun main() {
    println(App().greeting)
}
```

実行

```bash
./gradlew run
```

実行結果

```text
> Task :app:run
本日は晴天なり!

BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed
```

## 更にソースコードを改造

```kt:app/src/main/kotlin/ex04/App.kt
// ------------------------------------------------------------------
/*
	app/src/main/kotlin/ex04/App.kt

					Oct/17/2023
*/
// ------------------------------------------------------------------
package ex04

import java.time.LocalDate
import java.time.LocalDateTime

// ------------------------------------------------------------------
class App {
    val greeting: String
        get() {
            return "本日は晴天なり!"
        }
}

fun main() {
	println(" *** 開始 ***")
	println(LocalDate.now())
	println(LocalDateTime.now())
	println(App().greeting)
	println(" *** 終了 ***")
}
// ------------------------------------------------------------------
```

実行結果

```text
> Task :app:run
 *** 開始 ***
2023-10-17
2023-10-17T14:31:56.545742612
本日は晴天なり!
 *** 終了 ***

BUILD SUCCESSFUL in 575ms
```

## 参考: 生成された設定ファイル

```text:settings.gradle.kts
/*
 * This file was generated by the Gradle 'init' task.
 *
 * The settings file is used to specify which projects to include in your build.
 *
 * Detailed information about configuring a multi-project build in Gradle can be found
 * in the user manual at https://docs.gradle.org/7.2/userguide/multi_project_builds.html
 */

rootProject.name = "ex04"
include("app")
```

```app/build.gradle.kts
/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Kotlin application project to get you started.
 * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle
 * User Manual available at https://docs.gradle.org/7.2/userguide/building_java_projects.html
 */

plugins {
    // Apply the org.jetbrains.kotlin.jvm Plugin to add support for Kotlin.
    id("org.jetbrains.kotlin.jvm") version "1.5.0"

    // Apply the application plugin to add support for building a CLI application in Java.
    application
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Align versions of all Kotlin components
    implementation(platform("org.jetbrains.kotlin:kotlin-bom"))

    // Use the Kotlin JDK 8 standard library.
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

    // This dependency is used by the application.
    implementation("com.google.guava:guava:30.1.1-jre")

    // Use the Kotlin test library.
    testImplementation("org.jetbrains.kotlin:kotlin-test")

    // Use the Kotlin JUnit integration.
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit")
}

application {
    // Define the main class for the application.
    mainClass.set("ex04.AppKt")
}
```