Yoshi.dev

技術系の趣味、またはやった仕事やそこから学んだことを忘れないために

grpc×jib×skaffoldで少し詰まった

grpcを使って開発してるマイクロサービスでjibとskaffold使ってバリバリローカル開発しようとしてたら詰まった ちなみにフレームワークはktor

skaffold dev コマンドでskaffoldを起動すると下記のエラーが

エラー: シンボルを見つけられません
@javax.annotation.Generated(
                 ^
  シンボル:   クラス Generated
  場所: パッケージ javax.annotation

protocol buffersで作成したGRPC用のJavaファイルについているアノテーション @javax.annotation.Generated が見つけられませんと出ている IntelliJから普通に gradle run している分には何も問題ないのだが

解決方法はdependenciesにjavax.annotation-apiを追加すれば良い

compile("javax.annotation:javax.annotation-api:1.3.2")

build.gradle.kts

import com.google.protobuf.gradle.*
import org.gradle.kotlin.dsl.provider.gradleKotlinDslOf
import org.jetbrains.kotlin.gradle.dsl.Coroutines
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

import com.google.cloud.tools.jib.image.ImageFormat


val ktor_version: String by project
val kotlin_version: String by project
val logback_version: String by project

plugins {
    application
    kotlin("jvm") version "1.3.21"
    java
    id("com.google.protobuf") version "0.8.8"
    id("com.google.cloud.tools.jib") version "1.0.2"
}

jib {
    from {
        image = "openjdk:8"
    }
    to {
        image = "yoshi10321/app01"
    }
    container {
        jvmFlags = listOf("-Xms512m", "-Xdebug")
        args = listOf()
        ports = listOf("8080/tcp")
    }
}

group = "graphql"
version = "0.0.1"

application {
    mainClassName = "io.ktor.server.netty.EngineMain"
}

repositories {
    mavenLocal()
    jcenter()
    maven {
        url = uri("https://kotlin.bintray.com/ktor")
        url = uri("https://plugins.gradle.org/m2/")
    }
    mavenCentral()
}

dependencies {
    compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version")
    compile("io.ktor:ktor-server-netty:$ktor_version")
    compile("ch.qos.logback:logback-classic:$logback_version")
    compile("io.ktor:ktor-server-core:$ktor_version")
    compile("io.ktor:ktor-gson:$ktor_version")
    compile("io.ktor:ktor-client-core:$ktor_version")
    compile("io.ktor:ktor-client-core-jvm:$ktor_version")
    compile("io.ktor:ktor-client-cio:$ktor_version")
    testCompile("io.ktor:ktor-server-tests:$ktor_version")

    compile("io.grpc:grpc-netty-shaded:1.19.0")
    compile("io.grpc:grpc-protobuf:1.19.0")
    compile("io.grpc:grpc-stub:1.19.0")
    compile("com.google.protobuf:protobuf-java:3.6.1")

    compile("javax.annotation:javax.annotation-api:1.3.2")
}

kotlin.sourceSets["main"].kotlin.srcDirs("src")
kotlin.sourceSets["test"].kotlin.srcDirs("test")

sourceSets["main"].resources.srcDirs("resources")
sourceSets["test"].resources.srcDirs("testresources")

sourceSets["main"].java {
    srcDirs("build/generated/source/proto/main/grpc")
    srcDirs("build/generated/source/proto/main/java")
}

protobuf {
    protoc {
        // The artifact spec for the Protobuf Compiler
        artifact = "com.google.protobuf:protoc:3.6.1"
    }
    plugins {
        // Optional: an artifact spec for a protoc plugin, with "grpc" as
        // the identifier, which can be referred to in the "plugins"
        // container of the "generateProtoTasks" closure.
        id("grpc") {
            artifact = "io.grpc:protoc-gen-grpc-java:1.15.1"
        }
    }
    generateProtoTasks {
        ofSourceSet("main").forEach {
            it.plugins {
                // Apply the "grpc" plugin whose spec is defined above, without options.
                id("grpc")
            }
        }
    }
}

jibのfrom imageにopenjdk使ってるけど他のにしたらdependencies追加しなくてもなんとかならないかなー