我正在尝试从grpc-java工作中提供示例。 如果我使用gradle,这确实很容易,但是,我将把grpc集成到使用另一个构建系统的项目中。 我想知道如何使用protoc,javac和java编译和运行示例。 我能够从.proto源生成java源代码,但没有运气编译生成的java源代码。
我尝试了1000种组合(不同的类型),但没有任何效果。
> javac RouteGuideGrpc.java
< RouteGuideGrpc.java:3: error: package io.grpc.stub does not exist
import static io.grpc.stub.ClientCalls.asyncUnaryCall;
(省略了99个其他编译错误)
有人能展示一系列有用的命令吗? 谢谢。
Upd:我在Linux上这样做。
更新:我正在使用SBT,但这并不重要。我真正想要了解的是如何使用javac来编译生成的grpc代码。 我确定我在classpath中有grpc-core,grpc-netty,grpc-protobuf和grpc-stub(实际上,此时还不确定......)。
答案 0 :(得分:1)
包io.grpc.stub
是grpc-stub工件的一部分。要构建代码生成的组件,您的类路径中至少需要protobuf-java
,grpc-stub
,grpc-protobuf
和grpc-core
。根据您的编译方式,您可能还需要任何protobuf生成的类(grpc生成的存根取决于protobuf生成的protos)。
有关于compiler directory手动运行代码生成器的文档,但它不包括运行javac
。
如果您仍然遇到问题,请仔细检查protoc编译器和protobuf-java是否具有相同的版本,protoc-gen-grpc-java和grpc JAR具有相同的版本。
答案 1 :(得分:1)
好的,我能够解决编译时问题。
我最终将println语句插入到grpc附带的build.gradle文件中,以查看编译这些示例时使用的实际类路径。
原来,grpc libs的版本是0.9.0,而在我的sbt版本中,我指的是0.7.2。
就在今天,版本0.8.0的库被放到maven存储库中,当我将版本从0.7.2更改为0.8.0时,一切都按预期工作。
答案 2 :(得分:1)
我自己尝试从Gradle迁移到SBT时遇到了一些问题。
首先,您应该利用sbt-protobuf插件为您编译.proto
个文件。请务必:
protoc
的路径和版本:
version in PB.protobufConfig := "3.0.0"
protoc in PB.protobufConfig := PATH_PROTOC
.proto
个文件的位置(默认为src/main/protobuf
):
sourceDirectory in PB.protobufConfig := baseDirectory.value / "src" / "main" / "proto"
protoc
使用的grpc-java
的额外选项。第一个选项设置protoc-gen-grpc-java
插件箱的路径;第二步将grpc-java的输出路径设置为与sbt-protobuf
相同:
protocOptions in PB.protobufConfig ++= Seq(
"--plugin=protoc-gen-grpc-java=" + PATH_GRPC_JAVA_PLUGIN,
"--grpc-java_out=" + baseDirectory.value + "/target/src_managed/main/compiled_protobuf")
我最终放了一个存储库,所有这些都整理好了。 Here it is,希望它有所帮助!