GRPC .proto文件如何在java jar文件中工作



我是GRPC的新手,使用GRPC编写示例java函数,我使用protobuf-maven-plugin从我的.proto文件生成java文件。我在当地的开发区一切都很好。当我创建可执行jar文件时,我注意到在jar的根目录中存在我的.proto文件

├───GRpc.proto
├───com
└───META-INF

我想知道我们是否需要这个.proto文件在可执行jar中?如果是,运行jar时它的功能是什么?谢谢。

.protos包含在.jar中,允许像使用java依赖项一样轻松地使用protobuf依赖项。protobuf-maven-pluginprotobuf-gradle-plugin都支持查找protos的依赖项。

这个想法是为发布到Maven Central的protos生成代码。这些工件包含了足够的java和protobuf。

最简单的例子就是protobuf-java本身。Protobuf拥有"著名的Protobuf"。比如google.protobuf.Anygoogle.protobuf.Empty。假设你创建了一个原型,使用了一个:
syntax = "proto3";
package mypackage;
import "google/protobuf/any.proto";
message MyMethod {
google.protobuf.Any anyField = 1;
}

要为.proto生成代码,需要any.proto文件。但是要编译生成的java代码,需要com.google.protobuf.Any类。你需要两个依赖项。

.proto放在.jar中只允许添加一个依赖项来同时满足protobuf依赖项和java依赖项:

<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.21.1</version>
</dependency>

Protobuf-java并不是一个特例。例如,https://github.com/googleapis/googleapis在com.google.api.grpc:proto-google-common-protos等工件中发布为其protos生成的java代码。该依赖项还包括.protos,因此单个依赖项满足Protobuf和Java。

当您创建自己的protos并发布生成的Java代码时,protos被包含在内,以允许其他人创建依赖于您的protos的自己的protos。

它不需要在那里运行您的程序。然而,它的存在可能只是因为它足够重要,足以在gRPC生态系统中分享。

.proto最直接的用途是让其他人可以生成一个客户端来与你的.proto生成的服务对话,你可能已经知道了。

如果你或其他人不知道:gRPC的全部意义在于,一旦有人定义了一个。proto来描述他们的服务,尽管服务需要一些额外的编码(即。(您必须提供逻辑),无需额外编码即可生成完全工作的客户端。因此,更具体地说,在一个例子中,您(1)使用protobuf-maven-plugin生成一个服务器,(2)您必须使用您的逻辑@Override存根并通过StreamObserver返回数据,以及(3)您最终构建并部署您的服务器。与此同时,另一个人可以在某处应用gRPC Python工具在你的。proto上生成一个Python客户端,准备好与你的服务对话。

但是好吧,它在。jar中有什么用呢?再说一次,这是一份非常重要的文件,dna;或服务合同。想象一下,在未来有插件和工具可以"增强"以不同的方式生成原型的Java服务。如果这些插件和工具可以假设他们将得到。proto文件,而不是反向工程Java字节码来找出您开始的原始合约,那么这些插件和工具将更容易编写。

tl;dr - gRPC的很大一部分是关于互操作性的,所以共享编码互操作性的文件是有意义的,对于(未来)已知和未知的应用程序。

最新更新