gradle + javaでgRPC

# gradle + javaでgRPC

<details><summary>実行環境</summary>

```gradle
% gradle --version                                         

------------------------------------------------------------
Gradle 8.11
------------------------------------------------------------

Build time:    2024-11-11 13:58:01 UTC
Revision:      b2ef976169a05b3c76d04f0fa76a940859f96fa4

Kotlin:        2.0.20
Groovy:        3.0.22
Ant:           Apache Ant(TM) version 1.10.14 compiled on August 16 2023
Launcher JVM:  23.0.1 (Homebrew 23.0.1)
Daemon JVM:    /opt/homebrew/Cellar/openjdk/23.0.1/libexec/openjdk.jdk/Contents/Home (no JDK specified, using current Java home)
OS:            Mac OS X 13.2.1 aarch64

```

```gradle
% javac --version 
javac 23.0.1
```

```gradle
% java --version 
openjdk 23.0.1 2024-10-15
OpenJDK Runtime Environment (build 23.0.1+11-39)
OpenJDK 64-Bit Server VM (build 23.0.1+11-39, mixed mode, sharing)
```
</details>


gradleでprotoファイルをビルドして、interfaceを実装するためのメモです。


document:
https://grpc.io/docs/languages/java/quickstart/

project:
https://github.com/grpc/grpc-java/tree/v1.69.0/examples

```bash
$ git clone -b v1.69.0 --depth 1 https://github.com/grpc/grpc-java
```

```bash
$ cd grpc-java/examples
```

実行タスク一覧。
```gradle
$ ./gradlew tasks --all
```

# define proto

## Write `build.gradle`

### plugin

pluginはprotoやapplicationのビルドタスクを使用するために必要です。
`./gradlew generateProto`でprotoをビルドしたり、`./gradlew installDist`でアプリをビルドしたりできます。


```gradle
plugins {
    // Provide convenience executables for trying out the examples.
    id 'application'
    id 'com.google.protobuf' version '0.9.4'
    // Generate IntelliJ IDEA's .idea & .iml project files
    id 'idea'
}
```


### パス指定

`build.gradle`の`sourceSets`にprotoの入出力パスを明記します。入力パスは明記しない場合、`build.gradle`ファイルが配置されている階層の直下のパス`src/main/proto`がデフォルトのディレクトリパスとなります。`*.proto`ファイルがビルド対象です。

```gradle
sourceSets {
    main {
        java {
            srcDirs 'build/generated/source/proto/main/grpc'
            srcDirs 'build/generated/source/proto/main/java'
        }
    }
}
```

<details><summary>パスを変更したい場合</summary>

`src/main/proto`以外のパスをビルド対象としたい場合は次のように、`proto{}`にパスを指定します。

```gradle
sourceSets {
    main {
        // protoファイルの配置ディレクトリ
        proto {
            srcDir 'src/main/protobuf'
        }
        java {
            srcDirs 'build/generated/source/proto/main/grpc'
            srcDirs 'build/generated/source/proto/main/java'
        }
    }
}
```

</details>

今回は次の*.protoファイルがビルド対象です。
```gradle
% tree src/main/proto/
src/main/proto/
├── grpc
│   └── examples
│       └── echo
│           └── echo.proto
├── hello_streaming.proto
├── helloworld.proto
└── route_guide.proto
```

## compile proto

pluginに'com.google.protobuf'を指定すれば、`generateProto`タスクが有効になります。

```gradle
examples % ./gradlew generateProto
```

'build/generated/source/proto/main/grpc'に生成されます。
```
BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 up-to-date
```

## Server/Client 実装

protoで指定した関数を実装します。今回は省略。

## build for Application

実装したjavaファイルをビルドして実行していきます。

```
$ ./gradlew installDist
```

## 実行

### server実行

```gradle
$ ./build/install/examples/bin/hello-world-server
```

### client実行

```gradle
$ ./build/install/examples/bin/hello-world-client
```

## 参考

[build.gradle::sourceSets](https://blog.takehata-engineer.com/entry/server-side-kotlin-grpc-protocol-buffers-options)

[documents](https://grpc.io/docs/languages/java/quickstart/)

[grpc-java](https://github.com/grpc/grpc-java)

[gradle](https://docs.gradle.org/current/userguide/command_line_interface.html)