我有一个混合的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目录,但这似乎没有任何作用(实际上似乎没有必要)。
答案 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>
我花了很长时间才弄清楚这一点,因此,我将其发布为一个自我回答的问题,以节省其他人的时间。 我看到了许多相关的问题,但没有一个完全相同。祝你好运。