• [云实验室] 通过鲲鹏Maven仓进行Maven软件构建》的迁移软件包报错
    沙盒实验《通过鲲鹏Maven仓进行Maven软件构建》的迁移软件包这个环节折磨了半个小时都没法通过
  • [技术干货] 鲲鹏常用Maven软件管理工具
    JAR文件制作方式1、JAVA开发的应用在发布前通常会打包一个JAR文件,JAR( Java ARchive )是将一系列文件(包含库、依赖文件等)合并到单个压缩文件里2、手动制作:早期使用jar命令制作JAR文件,所有的编译、测试、代码生成、打包等工作需要手动重复执行,效率较低,出错的机率较高3、自动生成:借助Maven等工具,自动进行软件包生命周期的管理,从而提高工作效率,降低出错的机率注:程序开发的过程当中,构建工程,编写代码,测试代码,打包,部署,上线等每天都是重复工作。在传统过当中需要手工的去操作,那么效率是低效的。自动化构建工具Maven一键全自动完成构建工程,编写代码,测试代码,打包,部署,上线等工作,那么效率是高效的。Maven介绍Maven是Apache下的一个纯Java开发的开源项目,基于项目对象模型(缩写:POM),可以对Java项目进行构建,依赖管理。Maven官网链接: http://Maven.apache.org/Maven下载链接: http://Maven.apache.org/download.cgiMaven安装指导: http://Maven.apache.org/install.html1、当下Java开发工具圈中,目前最主流的有以下三个开发工具,Lvy依赖Maven 依赖gradle依赖,依赖管理已经成为了项目构建自动化工具中的一个主要部分2、构建在编程中是指什么?编程过程当中很多事情是与编程无关的项目管理工作,如下载依赖,编译源码,单元测试,项目部署等。一般的,小型项目我们可以手动实现这些操作,然而大型项目去实现则相对复杂。构建工具是帮助我们实现一系列项目管理、测试和部署操作的工具3、对于Java项目的构建工具;传统构建工具有Ant,主流构建工具:Maven,新兴构建工具:Gradle4、Maven构建项目的生命周期有哪些?validate:验证项目以及相关信息是否正确 compile:编译源代码和相关资源文件test:对测试代码进行测试package:根据不同的项目类型进行打包:verigy:验证打包的正确性install:将打包好的包安装到本地deploy:将打包好的包发布到远程POM文件简介Pom ( project object model )是Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等。以下为pom文件的部分内容:version:项目的版本号,如果项目仍然处在开发阶段,通常在版本中带有-SNAPSHOTmodelverion:模型版本,目前是4.0.0groupld:组织id,一般是一个公司域名的倒写 artifactld:项目名称,自定义生成注:groupld、artifactld和version组成了坐标,是一个项目的唯一标识,坐标除了标识项目外,另外也可以对应用使用的依赖进行标识Maven仓库简介修改本地仓库位置需要修改Maven安装目录下conf/settings.xml文件的local_repository参数指定远程仓库需要修改settings.xml文件中的servers参数鲲鹏Maven仓库鲲鹏Maven仓库提供了适配鲲鹏平台的so库,开发者可以直接调用,无需进行重新编译鲲鹏Maven仓库链接:https://repo.huaweicloud.com/kunpeng/maven/配置优先搜索鲲鹏Maven仓库在鲲鹏应用开发时,建议将远程仓库配置为优先搜索鲲鹏Maven仓库修改settings.xml文件在profiles便签下增加鲲鹏Maven仓库的信息,包括id、url将鲲鹏Maven仓库的信息放在第一位,使其可以被优先使用<profile> <id>kunpeng</id> <!-- 远程仓库列表,将华为鲲鹏 Maven 仓库放在最前面 --> <repositories> <repository> <id>kunpengmaven</id> <name>kunpeng maven</name> <url>https://repo.huaweicloud.com/kunpeng/maven/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> <!-- 其他 repository,配置其他Maven中央仓库,以华为云Maven为例 --> <repository> <id>huaweicloud</id> <name>huaweicloud maven</name> <url>https://repo.huaweicloud.com/repository/maven/</url> <releases> <enabled>true</enabled> </releases> </repository> </repositories> </profile> <!-- 激活上面的profile --> <activeProfiles> <activeProfile>kunpeng</activeProfile> </activeProfiles>Maven生命周期Maven为了对所有的构建过程抽象和统一,形成了一套高度完善的和易于扩展的生命周期Maven拥有3套生命周期1、clean:清理pre-clean 执行一些需要在clean之前完成的工作clean移除所有上一次构建生成的文件post-clean执行一些需要在clean之后立刻完成的工作2、default:编译、测试、打包、发布等default生命周期是真正构建时所需要执行的所有步骤3、site:站点生成site生命周期目的是见建立和发布项目站点Maven应用打包流程 开发后的应用可以使用Maven,通过POM文件的方式进行打包,并且,打包后的程序可以安装到本地仓库中,供其它程序调用注:JAR ( Java ARchive)是将一系列文件合并到单个压缩文件里,就象Zip那样。然而,同Java中其他任何东西一样,JAR文件是跨平台的,所以不必关心涉及具体平台的问题。
  • [虚拟化] ovirt部署问题-在编译ovirt-engine出错,求大神解答
    按照“鲲鹏BoostKit虚拟化使能套件部署指南 v08.pdf”手册部署ovirt环境,执行到7.4.4 编译ovirt-engine,在编译ovirt-engine 源码时,执行./automation/build-artifacts.sh命令,提示Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/ImmutableList,一直卡在这里无法继续执行。我的maven版本是Apache Maven 3.6.2 (Red Hat 3.6.2-5),通过降级到3.5.4不会有这个报错,但是,在执行./automation/build-artifacts.sh命令时,有一个步骤是yum builddep output/ovirt-engine-4.4.0.2-1.gite95709f.el8.src.rpm,每次在跑到这个步骤后,都会要求我更新maven,更新后就会出现Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/ImmutableList错误。求大神指点一二。问题已解决。解决方法:通过修改automation/build-artifacts.sh文件,将yum builddep output/ovirt-engine-4.4.0.2-1.gite95709f.el8.src.rpm注释后解决。编译完成后截图如下
  • [技术干货] linux下创建一个maven工程
    linux 下创建一个maven工程第一步:安装jdk步骤1 下载OpenJDK安装包。wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u191-b12/OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gz步骤2 解压安装包。tar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gz步骤3 将OpenJDK安装到指定目录,例如安装到“/opt/tools/installed”。mv jdk8u191-b12 /opt/tools/installed/步骤4 配置java环境变量。1. 打开“/etc/profile”文件。vi /etc/profile2. 在“/etc/profile”文件末尾处增加如下代码。JAVA_HOME=/opt/tools/installed/jdk8u191-b12PATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME PATH3. 修改完成后,按“Esc”键,输入:wq!命令保存退出。4. 使修改的环境变量生效。source /etc/profile步骤5:验证输入java -version第二步:安装maven软件和配置maven路径maven安装:步骤1 下载Maven安装包。wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz步骤2 解压安装包。tar -zxf apache-maven-3.5.4-bin.tar.gz步骤3 将Maven安装到指定目录,例如安装到“/opt/tools/installed”。mv apache-maven-3.5.4 /opt/tools/installed/步骤4 配置Maven环境变量。1. 在“/etc/profile”文件末尾增加如下几行。export  JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdkexport  MAVEN_HOME=/opt/tools/installed/apache-maven-3.5.4export MAVEN_HOMEexport PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH2. 使修改的环境变量生效。source /etc/profile3、验证maven安装成功输入命令:mvn –v步骤5 修改Maven配置文件“/opt/tools/installed/apache-maven-3.5.4/conf/settings.xml”中的本地仓路径、远程仓等。      配置maven工程中的setting文件(添加鲲鹏的maven库)如下:<profile>    <id>MyProfile</id>        <repositories>           <repository>            <id>kunpeng</id>            <url>https://mirrors.huaweicloud.com/kunpeng/maven</url>            <releases>                <enabled>true</enabled>            </releases>        </repository>        <repository>            <id>HuaweiCloudSDK</id>            <url>https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/</url>            <releases>                <enabled>true</enabled>            </releases>            <snapshots>                <enabled>false</enabled>            </snapshots>        </repository>              </repositories></profile> <activeProfiles>    <activeProfile>MyProfile</activeProfile>   </activeProfiles>第二步:创建helloworld的maven工程(自动生成,在当前目录会生成一个java工程) mvn archetype:generate -DgroupId=helloworld -DartifactId=helloworld 第三步:修改一下pom.xml文件,添加如下内容    <build>          <plugins>              <plugin>                  <groupId>org.apache.maven.plugins</groupId>                  <artifactId>maven-jar-plugin</artifactId>                  <version>2.6</version>                  <configuration>                      <archive>                          <manifest>                              <addClasspath>true</addClasspath>                              <classpathPrefix>lib/</classpathPrefix>                              <mainClass>helloworld.App</mainClass>                          </manifest>                      </archive>                  </configuration>              </plugin>              <plugin>                  <groupId>org.apache.maven.plugins</groupId>                  <artifactId>maven-dependency-plugin</artifactId>                  <version>2.10</version>                  <executions>                      <execution>                          <id>copy-dependencies</id>                          <phase>package</phase>                          <goals>                              <goal>copy-dependencies</goal>                          </goals>                          <configuration>                             <outputDirectory>${project.build.directory}/lib</outputDirectory>                          </configuration>                      </execution>                  </executions>              </plugin>          </plugins>  </build>  其中;maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容,com.xxg.Main指定MANIFEST.MF中的Main-Class,true会在MANIFEST.MF加上Class-Path项并配置依赖包,lib/指定依赖包所在目录。只是生成MANIFEST.MF文件还不够,maven-dependency-plugin插件用于将依赖包拷贝到${project.build.directory}/lib指定的位置,即lib目录下。2)mvn编译工程,接下来编译并运行Helloworld项目。进入到工程的pom.xml所在目录下,执行$ mvn clean package下载的依赖包会保存在~/.m2/repository文件夹中,打开这个文件夹,我们会发现里面的包正是按照坐标的目录结构进行存储的。Maven在依赖一个jar包时会先去本地库查找,如果没找到就会从网上下载。当然,并不是所有的包都能从网上下载到,比如我们自己开发的jar包,这时,我们就可以用mvn install命令将一个项目安装到本地仓库。打包成功后我们会发现项目中多了一个target文件夹,目录结构如下可以看到,在package过程中,maven完成了编译、测试代码,生成测试报告,生成jar包等一系列工作。同时在target目录下生产了一个helloworld-1.0-SNAPSHOT.jar 这个已经集成该工程所有依赖包的jarmvn package  #把这个工程打包成一个jar包mvn clean    #清除刚刚刚编译出来的target目录的文件3)运行jarjava –jar target/helloworld-1.0-SNAPSHOT.jar 
  • Maven使用
    项目开发的痛点1.不同的IDE的java工程无法兼容2.无IDE环境下如何对软件工程进行编译和打包3.工程中的各种框架的jar文件容易冲突为解决以上软件工程的痛点,maven为java项目提供了工艺的构建和管理方式,是业界标准。maven是基于项目对象模型(pom.xml)来管理软件工程。IntelliJ idea开发环境默认自带maven,可以自己下载最新的版本更新设置。如果我们想要在工程中引入某个jar 包,只需要在pom.xml 中引入其jar包的坐标即可。jar包的坐标可以在search.maven.org搜索组件的坐标。Maven 通过groupId、artifactId与version三个向量来定位Maven 仓库其jar 包所在的位置,并把对应的jar 包引入到工程中来。依赖的原则:最短路径优先原则:如果A 依赖于B,B 依赖于C,在B 和C 中同时有某个组件的依赖,并且版本不一致,那么A中会引入B的依赖。路径相同先声明原则:如果在A 同时依赖于B 和C,B 和C 没有依赖关系,并且都有某组件的依赖,且版本不一致,那么需要在A中事先声明组件特定版本。如果需要排除某一版本的依赖,可以使用exclusion来进行排除。
  • [问题求助] 通过maven推送镜像到SWR仓库出错
    1.起因客户的代码环境均是在本地,包括gitlib仓库也是部署在本地;客户希望通过本地IDE环境,在线下实现代码开发,并通过Maven的maven-docker-plugin插件,实现本地容器镜像封装,同时推送容器镜像到华为云SWR镜像仓库,尽可能的实现发布流程自动化;但是在实现的时候,往华为云上推送镜像时,一直出错,无法成功推送;插件推送时,报错信息如下:[INFO] Pushing swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0The push refers to repository [swr.cn-east-2.myhuaweicloud.com/busyfan/my-web][WARNING] Failed to push swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0, retrying in 10 seconds (1/5).[INFO] Pushing swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0The push refers to repository [swr.cn-east-2.myhuaweicloud.com/busyfan/my-web][WARNING] Failed to push swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0, retrying in 10 seconds (2/5).[INFO] Pushing swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0The push refers to repository [swr.cn-east-2.myhuaweicloud.com/busyfan/my-web][WARNING] Failed to push swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0, retrying in 10 seconds (3/5).[INFO] Pushing swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0The push refers to repository [swr.cn-east-2.myhuaweicloud.com/busyfan/my-web][WARNING] Failed to push swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0, retrying in 10 seconds (4/5).[INFO] Pushing swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0The push refers to repository [swr.cn-east-2.myhuaweicloud.com/busyfan/my-web][WARNING] Failed to push swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0, retrying in 10 seconds (5/5).[INFO] Pushing swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0The push refers to repository [swr.cn-east-2.myhuaweicloud.com/busyfan/my-web]Failed to push swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0, retrying in 10 seconds (5/5).Failed to execute goal com.spotify:docker-maven-plugin:1.2.2:build (default-cli) on project docker-plugin122: Exception caught2.对比测试整了快一天了,死活是调试不通,一直以为是自己的配置文件有问题,各种查文档,各种改配置,都快崩溃了;快下班的时候,突然想着,要不往hub.docker.com上推送一下试试看,没马想竟然一下子就推送成功了......实在没想到是华为云SWR平台有问题啊。。。找到问题所在就好办了,换到华东-上海一地域,也是一下子就推送成功了,了然。插件版本华为-华东-上海一华为-华东-上海二hub.docker.com0.4.13推送成功推送成功推送成功1.2.2推送成功推送失败推送成功上表是各种测试后的结果;因为日常默认使用的地域就是(华东-上海二),所以就被抗了一天时间;没想到会是SWR平台的问题,是因为前几天使用0.4.13版本的插件,是能成功的。3.pom.xml(华东-上海二)      <plugin>        <groupId>com.spotify</groupId>        <artifactId>docker-maven-plugin</artifactId>        <version>0.4.13</version>        <!-- <version>1.2.2</version> -->        <configuration>          <!-- 镜像名称,由两部分组成:       1. 地域endpoint:swr.cn-east-2.myhuaweicloud.com       2. 该地域内创建的组织名称:busyfan -->          <imageName>swr.cn-east-2.myhuaweicloud.com/busyfan/my-web:1.0</imageName>          <dockerHost>http://192.168.10.84:2375</dockerHost>          <baseImage>java:8</baseImage>          <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>          <resources>            <resource>              <targetPath>/</targetPath>              <directory>${project.build.directory}</directory>              <include>${project.build.finalName}.jar</include>            </resource>          </resources>          <serverId>busyfan</serverId>        </configuration>      </plugin>个人猜测,大概是因为(华东-上海二)目前已经不开放给新用户使用了,所以该地域的很多服务,已经不怎么更新了;所以这就算是个BUG了吧。
  • [技术干货] 编译netty时报testsuite-osgi-deps相关NoFileAssignedException错误解决方法
    【问题描述】编译netty 4.0.0.Beta1等版本执行mvn install时报testsuite-osgi-deps相关NoFileAssignedException错误,详细报错如下:[ERROR] Failed to execute goal org.apache.maven.plugins:.maven-install-plugin:3.0.0-M1: install (default-install) on project netty-testsuite-osgi-deps: NoFileAssignedException:. The packaging plugin for this project did not assign a main file to the project but it has attachments. Change packaginf to 'pom'. -> [Help 1]【解决方法】将编译命令从mvn install 改成mvn package再编译即可通过。【注】:其他版本遇到类似报错可参考相同解决方法;
  • [技术干货] 编译netty时报testsuite-osgi-deps相关Unable to provision错误解决方法
    【问题描述】编译netty 4.0.0.CR1等版本执行mvn install时报testsuite-osgi-deps相关Unable to provision错误,详细报错如下:[ERROR] Failed to execute goal org.apache.karaf.tooling:.karaf-maven-plugin:3.0.0.RC1: features-generate-descriptor (default-features-generate-descriptor) on project netty-testsuite-osgi-deps: Execution default-features-generate-descriptor of goal org.apache.karaf.tooling:.karaf-maven-plugin:3.0.0.RC1: features-generate-descriptor failed: Unable to load mojo 'features-generate-descriptor' (or one of its required components) from the plugin 'org.apache.karaf.tooling:.karaf-maven-plugin:3.0.0.RC1' : com.google.inject.ProvisionException: Unable to provision, see the following errors:【解决方法】修改pom.xml中依赖的karaf-maven-plugin版本号,从3.0.0.RC1修改为3.0.1:【注】:其他版本遇到类似报错可参考相同解决方法;
  • [技术干货] 编译netty报karaf-maven-plugin:jar:3.0.0-SNAPSHOT is missing错误解决方法
    【问题描述】编译netty 4.0.0.Beta1、4.0.0.Beta2、4.0.0.Beta3等版本执行mvn install时报karaf-maven-plugin:jar:3.0.0-SNAPSHOT is missing等错误,详细报错如下:The POM for org.apache.karaf.tooling:karaf-maven-plugin:jar:3.0.0-SNAPSHOT is missing, no dependecy information available[ERROR] [ERROR] Some problems were encountered while processing the POMs:【解决方法】修改testsuite-osgi/testsuite-osgi-deps/pom.xml文件:将karaf-maven-plugin的依赖版本号从3.0.0-SNAPSHOT修改为3.0.1:【注】:在netty的4.0.0.Beta1、4.0.0.Beta2、4.0.0.Beta3等3个版本需要修改testsuite-osgi/testsuite-osgi-deps/pom.xml文件中karaf-maven-plugin的依赖版本号;
  • [技术干货] 编译netty时报codec-http相关Signature errors found错误解决方法
    【问题描述】编译netty 4.0.0.Alpha7、4.0.0.Alpha8、4.0.0.Beta1等版本执行mvn install时报Signature errors found等错误,详细报错如下:Failed to execute goal org.codehaus.mojo:animal-sniffer-maven-plugin:1.8:check (default) on project netty-code-http: Signature errors found. Verify them and put @ignoreJRERequirement on them.【解决方法】删除或注释pom.xml如下内容:【注】:在netty的4.0.0.Alpha7版本对应pom.xml的303行,4.0.0.Alpha8版本对应pom.xml的305行,4.0.0.Beta1版本对应pom.xml的338行;
  • [技术干货] 编译netty时报testsuite相关General SSLEngine problem错误解决方法
    【问题描述】编译netty 4.0.0.Alpha1等版本执行mvn install时报General SSLEngine problem等错误,详细报错如下:【解决方法】方法1:在pom.xml中注释testsuite然后再次执行mvn install或mvn package进行编译;方法2:执行mvn编译命令时,增加-DskipTests参数,即mvn clean install -DskipTests或mvn clean package -DskipTests方法3:先进入源码路径的testsuite路径中执行执行mvn clean install -DskipTests编译netty-testsuite,然后返回上层源码解压路径分别到common/buffer/codec/codec-http/transport/handler/example/all路径下分别执行mvn clean install -DskipTests或mvn clean package -DskipTests单独编译各netty的子组件common/buffer/codec/codec-http/transport/handler/example/all。
  • [技术干货] 基于Javafaker造测试样例数据案例
    偶然发现一款基于java语言来构造测试数据的工具,给大家做下分享一、 打开 IntelliJ IDEA,创建一个maven项目,配置pom.xml文件如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     <modelVersion>4.0.0</modelVersion>     <groupId>com.huawei.data.demo</groupId>     <artifactId>generate-data</artifactId>     <version>1.0-SNAPSHOT</version>     <dependencies>         <dependency>             <groupId>com.github.javafaker</groupId>             <artifactId>javafaker</artifactId>             <version>1.0.2</version>         </dependency>         <dependency>             <groupId>org.projectlombok</groupId>             <artifactId>lombok</artifactId>             <version>1.16.20</version>             <scope>provided</scope>         </dependency>     </dependencies> </project>二、创建一个POJO类,定义属性如下,注意这里使用了lombok插件@Data public class UserInfo {     private String realName;     private String cellPhone;     private String universityName;     private String city;     private String street;     @Override     public String toString() {         return realName + "," + cellPhone + "," + universityName + "," + city + "," + street + "\n";     } }三、创建生成测试数据的测试类public class GenerateData { public static void main(String[] args) throws Exception {     FileOutputStream outputStream = new FileOutputStream("test.txt",true);     Faker fakerWithCN = new Faker(Locale.CHINA);     for (int i=0; i<10;i++){         UserInfo userInfo = new UserInfo();         userInfo.setRealName(fakerWithCN.name().fullName());         userInfo.setCellPhone(fakerWithCN.phoneNumber().cellPhone());         userInfo.setCity(fakerWithCN.address().city());         userInfo.setStreet(fakerWithCN.address().streetAddress());         userInfo.setUniversityName(fakerWithCN.university().name());         System.out.println(userInfo.toString());         outputStream.write(userInfo.toString().getBytes(StandardCharsets.UTF_8));     }     outputStream.close();     } }执行后,查看生成的测试数据文件 test.txt中如下更多javafaker支持的数据分类,可查看  http://dius.github.io/java-faker/apidocs/index.html
  • [技术干货] 编译jansi报core dumped、Corrupted STDOUT by directly writing ...解决方法
    【问题描述】编译jansi 2.0过程中报core dumped、Corrupted STDOUT by directly writing native stream in forked JVM 1错误,详细报错如下:【解决方法】修改pom.xml,将maven-surefire-plugin版本号从3.0.0-M5改为2.9,如下图所示再次执行mvn install编译即可;
  • [技术干货] 编译jansi报A fatal error has been detected by the Java Runtime解决方法
    【问题描述】编译jansi 2.0报A fatal error has been detected by the Java Runtime Environment错误,详细报错如下【解决方法】修改pom.xml文件将189行注释然后再执行mvn install编译;
  • [技术干货] 【原创】动手实现语音技术中的gRPC传输客户端与服务端
    # 0 概述 根据gRPC协议生成客户端与服务端代码 步骤: 一、使用protoc buffer生成gRPC通信代码和消息体; 二、根据gRPC通信代码中的Service写Service实现类; 三、根据Service实现类实现服务端代码与客户端代码; gRPC将通信管道、请求与响应的消息体编码序列化及反序列化都通过proto buffer自动生成了,开发者只需要将生成的gRPC的基础实现类xxxGrpc.xxxImplBase扩展为一个实现类,在该实现类中说明要对客户端请求体做哪些事情,以及定义响应体的格式。使用gRPC的接口与Service实现类实现服务端代码与客户端代码。 # 1 使用protoc buffer生成gRPC通信代码和消息体 使用maven的grpc依赖与插件生成代码。 步骤: 1. 将.proto协议文件放置在java/main/proto目录下; 2. 配置pom.xml文件中的依赖与插件(根据官方文档) 3. 执行mvn clean install 这样grpc通信部分代码会生成在target/generated-sources/protobuf/grpc-java下,命名为xxxxGrpc.java,消息体部分代码会生成在target/generated-sources/protobuf/java下,命名在.proto文件中指定。 # 2 根据生成的代码编写Service实现类 协议文件.proto一般只说明方法名称、gRPC服务类型、请求与响应的消息体类型,但是具体根据请求得到什么样子的响应就需要自己编写Service实现类。 步骤: 1. 将第1步生成的通信代码与消息体代码放在一个另起的工程里; 2. 在这个另起的工程里定义一个xxxImpl的实现类,继承gRPC通信代码中的xxxGrpc.xxxImplBase实现类; 3. 在新的实现类中通过gRPC的newBuilder() API处理request与response。 # 3 实现服务端代码 服务端的代码主要是通过上一步定义的Service实现类结合gRPC API完成编写。 步骤: 1. 定义gRPC Server; 2. 使用gRPC的ServerBuilder API与Service实现类xxxImpl给定义好的gRPC Server赋值; 3. 定义gRPC Server中的start() stop()以及主启动main方法。 # 4 实现客户端代码 客户端的代码主要是通过定义gRPC的channel和stub发起请求的查询、通信、查询、序列化/反序列化的一系列操作,后面的这些操作开发者不感知。 步骤: 1. 使用gRPC的NettyChannelBuilder API定义channel; 2. 使用生成的通信代码xxxGrpc.xxxBlockingStub定义stub; 3. 定义gRPC中的方法,该方法与stub中的方法一致; 4. 定义客户端主启动main方法实施调用。 # 附录: gRPC官方文档:https://grpc.io/docs/what-is-grpc/core-concepts/ Proto3语法:https://developers.google.com/protocol-buffers/docs/proto3
总条数:123 到第
上滑加载中