使用Maven使用Kotlin和Java编译gRPC(找不到各种包)

时间:2019-12-16 16:36:15

标签: kotlin grpc grpc-java

我有一个混合的kotlin / java项目,我想向其中添加gRPC。我像往常一样配置了gRPC插件:

    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.6.2</version>
        </extension>
    </extensions>

    <plugins>
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.6.1</version>
            <configuration>
                <protocArtifact>
                    com.google.protobuf:protoc:3.11.2:exe:${os.detected.classifier}
                </protocArtifact>
                <pluginId>grpc-java</pluginId>
                <pluginArtifact>
                    io.grpc:protoc-gen-grpc-java:1.25.0:exe:${os.detected.classifier}
                </pluginArtifact>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>compile-custom</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        ...

但是从头开始构建时

mvn clean && mvn package

kotlin代码将永远找不到生成的源。从IntelliJ进行首次构建时,它可以正常工作-IntelliJ知道该怎么做。

我尝试将build-helper-maven-plugin配置为包括protobuf编译器和stub生成器使用的generate-sources目录,但这似乎没有任何作用(实际上似乎没有必要)。

1 个答案:

答案 0 :(得分:0)

原来的答案是由于插件执行的顺序。通常,对于kotlin-java混合项目,您要首先编译kotlin,以便Java编译器知道如何查找kotlin类。问题是,如果您这样做,则kotlin编译器还看不到protoc生成的java类。这是循环依赖。

花了我一段时间才能弄清楚,但要修复它,您只需要告诉kotlin编译器在哪里可以找到protoc生成的 sources ,就像这样:

        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>

            <executions>
                <execution>
                    <id>compile</id>
                    <goals> <goal>compile</goal> </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/main/java</sourceDir>
                            <sourceDir>${project.build.directory}/generated-sources/protobuf/java/</sourceDir>
                            <sourceDir>${project.build.directory}/generated-sources/protobuf/grpc-java/</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
                ...
        </plugin>

我花了很长时间才弄清楚这一点,因此,我将其发布为一个自我回答的问题,以节省其他人的时间。   我看到了许多相关的问题,但没有一个完全相同。祝你好运。