【JAVA】Maven构建java-grpc-protobuf代码生成测试

本次是通过Maven工具构建Java测试工程,需要将原本通过gradle构建的项目需要通过maven构建加入公司代码库,通过Maven构建涉及到接下来要介绍的插件,总是发现pom.xml编译不通过,看到网上都是千篇一律的插件配置,自己就是编译不通过,不知道大家有木有遇到,下面我将调试过程以及解决方案记录如下。

1.定义proto文件

因为是测试和官网一样,定义一个简单的hello.proto文件

2.maven插件配置

<1>添加依赖

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><grpc.version>1.59.1</grpc.version><!-- CURRENT_GRPC_VERSION --><protobuf.version>3.24.0</protobuf.version><protoc.version>3.24.0</protoc.version><!-- required for JDK 8 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencyManagement><dependencies><dependency><groupId>io.grpc</groupId><artifactId>grpc-bom</artifactId><version>${grpc.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId><!--<version>1.59.1</version>--><scope>runtime</scope></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><!--<version>1.59.1</version>--></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-services</artifactId></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><!--<version>1.59.1</version>--></dependency><dependency> <!-- necessary for Java 9+ --><groupId>org.apache.tomcat</groupId><artifactId>annotations-api</artifactId><version>6.0.53</version><scope>provided</scope></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>${protobuf.version}</version></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java-util</artifactId><version>${protobuf.version}</version></dependency></dependencies>

<2>添加插件

<build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.7.1</version></extension></extensions><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.6.1</version><configuration><protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact><protoSourceRoot>src/main/proto</protoSourceRoot></configuration><executions><execution><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-enforcer-plugin</artifactId><version>1.4.1</version><executions><execution><id>enforce</id><goals><goal>enforce</goal></goals><configuration><rules><requireUpperBoundDeps/></rules></configuration></execution></executions></plugin></plugins></build>

这个插件在我的本地无法编译通过,大家都知道maven编译不通过是没法执行接下来的命令,执行编译是为了将proto文件生成对应的java代码。 

<3>执行命令

mvn clean compile

结果是报错了,具体错误没有记录。

<4>修改插件配置

参考:java - How to use google protobuf compiler with maven-compiler-plugin - Stack Overflow

查阅资料将插件配置修改为

 <configuration><additionalProtoPathElements><additionalProtoPathElement>${project.basedir}/src/main/resources</additionalProtoPathElement></additionalProtoPathElements><protocArtifact>com.google.protobuf:protoc:3.7.0:exe:${os.detected.classifier}</protocArtifact></configuration>

再次执行编译还是不通过,继续search。。。

找到io.github.ascopes下的protobuf-maven-plugin

           <plugin><groupId>io.github.ascopes</groupId><artifactId>protobuf-maven-plugin</artifactId>
&lt;!&ndash;    <version>${protobuf-maven-plugin.version}</version>&ndash;&gt;<configuration><protocVersion>${protobuf.version}</protocVersion></configuration><executions><execution><goals><goal>generate</goal></goals></execution></executions></plugin>

 经过测试没有下载到io.github.ascopes#protobuf-maven-plugin插件,这个插件也许是可以用的,我没有切换maven仓库源,只是在maven 仓库官网没找到而已,果断放弃了。如果要使用这个插件需要注意一个默认约束,你定义的proto文件位置:src/main/protobuf

插件默认会从这个位置读取proto文件,除非你修改插件配置。

继续寻找其他插件,继续search。。。

功夫不负有心人,果然找到了一款插件配置如下

先贴一下地址:

How to Work With Protobuf-Maven Projects in IntelliJ IDEA

How to Work With Protobuf-Maven Projects in IntelliJ IDEA | The IntelliJ IDEA Blog

源码地址:GitHub - elenakozlova/maven-protobuf: sample maven-protobuf project for the blog post 

 <plugin><groupId>org.codehaus.mojo</groupId><artifactId>build-helper-maven-plugin</artifactId><version>3.3.0</version><executions><execution><id>test</id><phase>generate-sources</phase><goals><goal>add-source</goal></goals><configuration><sources><source>${project.basedir}/target/generated-sources</source></sources></configuration></execution></executions></plugin><plugin><groupId>com.github.os72</groupId><artifactId>protoc-jar-maven-plugin</artifactId><version>3.11.4</version><executions><execution><phase>generate-sources</phase><goals><goal>run</goal></goals><configuration><optimizeCodegen>false</optimizeCodegen><protocVersion>${protobuf.version}</protocVersion><includeStdTypes>true</includeStdTypes></configuration></execution></executions></plugin>

他强调需要依赖

    <dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>${project.basedir}</version></dependency>

配置后插件后,pom.xml编译通过 ,心里爽快多了。

继续执行命令编译

mvn clean compile

不幸的是又出现错误

Unsupported platform: protoc-3.24.0-osx-x86_64.exe

这个错误一看就是和protoc安装版本有关系,我的是arm操作系统,显示x86肯定不对。

我猜测自己的mac os安装的protobuf未生效造成的,执行命令将protoc命令加入环境变量

$ source ~/.bash_profile

执行完后重新构建,果真通过

在插件${project.basedir}/target/generated-sources指定的target下生成了我们需要的Java源码文件

⚠️注意:插件要求你的proto文件路径(默认):src/main/protobuf 

关于Unsupported platform: protoc-3.24.0-osx-x86_64.exe错误应该还有以下解决办法,issues链接如下(针对mac os M1/M2):

Support for M1 Macs (osx-aarch_64) · Issue #93 · os72/protoc-jar · GitHub

  <profile><build><plugins><plugin><groupId>com.github.os72</groupId><artifactId>protoc-jar-maven-plugin</artifactId><executions> <execution><configuration><protocCommand>protoc</protocCommand> <!-- brew install protobuf --></configuration></execution> </executions></plugin></plugins></build><activation><os><name>mac os x</name><arch>aarch64</arch><family>mac</family></os></activation></profile>
</profiles>

<5>配置插件生成java-grpc调用接口定义

<plugin><groupId>com.github.os72</groupId><artifactId>protoc-jar-maven-plugin</artifactId><version>3.11.4</version><executions><execution><phase>generate-sources</phase><goals><goal>run</goal></goals><configuration><optimizeCodegen>true</optimizeCodegen><protocVersion>${protobuf.version}</protocVersion><includeStdTypes>true</includeStdTypes><!--<includeDirectories><directory>src/main/proto</directory></includeDirectories>--><!--指定proto文件 --><inputDirectories><directory>src/main/protobuf</directory></inputDirectories><outputTargets><outputTarget><type>java</type></outputTarget><outputTarget><type>grpc-java</type><pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.1</pluginArtifact></outputTarget></outputTargets></configuration></execution></executions></plugin>

执行重新构建

$ mvn clean compile

控制台打印如下:

 

生成程序如下:

以上针对Java版本的gRPC代码生成和官网不一样,很容易理解,希望给刷到的同学带来些许帮助。

插件:protoc-jar-maven-plugin官方使用详细说明:

protoc-jar-maven-plugin - Introduction

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件产品研发过程 - 二、概要设计

软件产品研发过程 - 概要设计 相关系列文章 软件产品研发管理经验总结-管理细分 软件研发管理经验总结 - 事务管理 软件研发管理经验总结 - 技术管理 软件产品研发过程 - 二、概要设计 目录 软件产品研发过程 - 概要设计一、概要设计概述二、概要设计过程1、模块概述2、应用场景…

68从零开始学Java之Set集合都有哪些特性

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥带大家学习了List集合的用法和特性&#xff0c;尤其是对ArrayList和L…

无人奶柜:零售业的自助革命

无人奶柜&#xff1a;零售业的自助革命 无人奶柜作为零售业的一项创新技术&#xff0c;正在改变人们购买奶制品的方式&#xff0c;并对零售业产生深远的影响。它的出现提供了更便捷、高效、便利的购物体验&#xff0c;节省了人力成本&#xff0c;同时也为零售商带来了创新机会和…

大师学SwiftUI第18章Part3 - 自定义视频播放器

视频 录制和播放视频对用户来说和拍照、显示图片一样重要。和图片一样&#xff0c;Apple框架中内置了播放视频和创建自定义播放器的工具。 视频播放器 SwiftUI定义了​​VideoPlayer​​视图用于播放视频。该视图提供了所有用于播放、停止、前进和后退的控件。视图包含如下初…

Notes数据结合报表工具Tableau

大家好&#xff0c;才是真的好。 我希望你看过前面两篇内容《Domino REST API安装和运行》和《Domino REST API安装和运行》&#xff0c;更希望你能看过《Notes数据直接在Excel中统计&#xff01;》&#xff0c;有了这些内容作为基础&#xff0c;今天的内容就显得特别简单。 …

Freertos任务管理

一.任务状态理论讲解 正在执行的任务状态是running&#xff0c;其他执行的等待执行的任务状态是ready 1.修改间隔时间 2.任务状态 处于各个状态的任务是怎样被管理起来的&#xff1a;链表 3.代码 TaskHandle_t xHandleTask1; TaskHandle_t xHandleTask3;static int task1f…

6个实用又好用的交互原型工具!

在 UI/UX 设计中&#xff0c;原型设计是至关重要的一步。正如用户体验中的其它环节一样&#xff0c;有无数的交互原型工具可以帮助你完成原型设计。市场上有太多的交互原型工具&#xff0c;如果你不知道选择哪一种&#xff0c;那么我们将为你介绍 6 个实用又好用的交互原型工具…

Multidimensional Scaling(MDS多维缩放)算法及其应用

在这篇博客中&#xff0c;我将与大家分享在流形分析领域的一个非常重要的方法&#xff0c;即多维缩放MDS。整体来说&#xff0c;该方法提供了一种将内蕴距离映射到显性欧氏空间的计算&#xff0c;为非刚性形状分析提供了一种解决方案。当初就是因为读了Bronstein的相关工作【1】…

智能优化算法应用:基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鼠群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

6页手写笔记总结信号与系统常考知识大题知识点

题型一 判断系统特性题型二 求系统卷积题型三 求三大变换正反变换题型四 求全响应题型五 已知微分方程求系统传递函数题型六 已知系统的传递函数求微分方程题型七 画出系统的零极点图&#xff0c;并判断系统的因果性和稳定性 &#xff08;笔记适合快速复习&#xff0c;可能会有…

2023 年最新 FPV 套件评测

FPV 飞行是近年来非常流行的一种新兴运动。它可以让您在第一人称视角下体验飞行的乐趣。FPV 套件可以分为多种类型&#xff0c;根据您的需求和预算&#xff0c;您可以选择合适的套件。 下面我们将对 2023 年最新的几款 FPV 套件进行评测&#xff0c;帮助您选择合适的产品。 Sp…

InST论文复现

论文地址&#xff1a;https://arxiv.org/abs/2211.13203 论文git&#xff1a;https://github.com/zyxElsa/InST 遇到的问题&#xff1a; 1.requests.exceptions.SSLError: HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /openai/clip-…

一个容器中填值,值太多不换行,而是调小字体大小和行高

<!-- clampLineHeight 重计算行高 --> <!-- clampTextSize 重计算字体大小 --> <!-- 这里的div高8mm, 宽6cm, 文本为text --> <div style"height:8mm;width:6cm;text-align:left"><span :style"{ fontSize: clampTextSize(text, 6cm…

用python测试网络上可达的网络设备

用python测试网络上可达的网络设备 之前使用的os在python中执行ping测试网络中可达的目标&#xff0c;但是他在执行ping命令时脚本会将系统执行ping时的回显内容显示出来&#xff0c;有时这些回显并不是必要的。如果用脚本一次性ping成百上千台网络设备或者URL时会影响美观和阅…

MySQL中的索引①——索引介绍、结构、分类、语法、SQL性能分析

目录 目录 索引概述--> 介绍---> 优缺点---> 索引结构--> ​编辑 存储引擎支持情况---> BTree---> BTree---> Hash---> Hash特点---> 思考题 索引分类--> InnoDB存储引擎中---> 聚集索引---> 二级索引---> 执行过程--…

SpringBootAdmin

SpringBootAdmin 文章目录 SpringBootAdmin创建SpringBootAdmin服务端创建SpringBootAdmin客户端启动应用 总结 github地址 https://github.com/codecentric/spring-boot-admin 可以查到所有的版本号 创建SpringBootAdmin服务端 创建springBoot项目的时候&#xff0c;在ops选项…

外贸平台获客技巧分享!(个人经历)

作为一名从事外贸行业多年的专业人士&#xff0c;我深知在竞争激烈的市场中获取客户的重要性&#xff0c;今天&#xff0c;我想与大家分享一些我在外贸平台上获客的技巧和经验&#xff0c;希望能够帮助到需要的人。 首先&#xff0c;我们需要明确一点&#xff0c;外贸平台是一…

一键抠图|3个智能AI抠图软件实现抠图自由!

听说你对如何利用AI抠图技术去除白色背景感兴趣&#xff1f;设想一下&#xff0c;你有一张某人站在白色背景前的照片&#xff0c;而你只希望能留下这个人物。在过去&#xff0c;你可能需要花费大量时间和精力手动进行抠图。但现在&#xff0c;AI技术来拯救你了&#xff01;AI可…

2024年MCM/ICM美国大学生数学建模竞赛备战指南

01 2024美赛基本要求 1.关于时间&#xff08;北京时间&#xff09; 比赛开始时间&#xff1a; 2024年2月2日6:00至 2024年2月6日9:00 提交截止时间&#xff1a;2024年2月6日10:00 结果发布时间&#xff1a;结果将于2024年5月31日或之前发布 2.关于规则 完整的解决方案现…

Redis应用-缓存

目录 什么是缓存 使用redis作为缓存 缓存的更新策略 通用的淘汰策略 redis内置的淘汰策略 缓存预热 缓存穿透 缓存雪崩 缓存击穿 什么是缓存 缓存(cache)是计算机中一个经典的概念,在很多的场景中都会涉及到. 核心思路就是把一些常用的数据放到触手可及(访问速度更快…