【JAVA】protobuf在Java中代码测试用例

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

1.定义proto文件

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

【JAVA】protobuf在Java中代码测试用例_第1张图片

2.maven插件配置

<1>添加依赖


        UTF-8
        1.59.1
        3.24.0
        3.24.0
        
        1.8
        1.8
    

    
        
            
                io.grpc
                grpc-bom
                ${grpc.version}
                pom
                import
            
        
    
    
        
            io.grpc
            grpc-netty-shaded
            
            runtime
        
        
            io.grpc
            grpc-protobuf
            
        
        
            io.grpc
            grpc-services
        
        
            io.grpc
            grpc-stub
            
        
         
            org.apache.tomcat
            annotations-api
            6.0.53
            provided
        
        
            com.google.protobuf
            protobuf-java
            ${protobuf.version}
        
        
            com.google.protobuf
            protobuf-java-util
            ${protobuf.version}
        
    

<2>添加插件


        
            
                kr.motd.maven
                os-maven-plugin
                1.7.1
            
        
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            

            
                org.xolstice.maven.plugins
                protobuf-maven-plugin
                0.6.1
                
                    com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
                    grpc-java
                    io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
                    src/main/proto
                
               
                
                    
                        
                            compile
                            compile-custom
                        
                    
                
            
           

            
                org.apache.maven.plugins
                maven-enforcer-plugin
                1.4.1
                
                    
                        enforce
                        
                            enforce
                        
                        
                            
                                
                            
                        
                    
                
            
        
    

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

<3>执行命令

mvn clean compile

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

<4>修改插件配置

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

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

 
         
                        ${project.basedir}/src/main/resources
          
                    com.google.protobuf:protoc:3.7.0:exe:${os.detected.classifier}
 

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

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

           
                io.github.ascopes
                protobuf-maven-plugin
<!–    ${protobuf-maven-plugin.version}–>

                
                    ${protobuf.version}
                

                
                    
                        
                            generate
                        
                    
                
            

 经过测试没有下载到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 

 
                org.codehaus.mojo
                build-helper-maven-plugin
                3.3.0
                
                    
                        test
                        generate-sources
                        
                            add-source
                        
                        
                            
                                ${project.basedir}/target/generated-sources
                            
                        
                    
                
            

            
                com.github.os72
                protoc-jar-maven-plugin
                3.11.4
                
                    
                        generate-sources
                        
                            run
                        
                        
                            false
                            ${protobuf.version}
                            true
                        
                    
                
            

他强调需要依赖

    
       com.google.protobuf
       protobuf-java
       ${project.basedir}
   

配置后插件后,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

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

【JAVA】protobuf在Java中代码测试用例_第2张图片

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

【JAVA】protobuf在Java中代码测试用例_第3张图片

⚠️注意:插件要求你的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

  
    
      
        
          com.github.os72
          protoc-jar-maven-plugin
           
            
              
                protoc 
              
             
          
        
      
    
    
      
        mac os x
        aarch64
        mac
      
    
  

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


                com.github.os72
                protoc-jar-maven-plugin
                3.11.4
                
                    
                        generate-sources
                        
                            run
                        
                        
                            true
                            ${protobuf.version}
                            true
                            

                            
                            
                                src/main/protobuf
                            
                            
                                
                                    java
                                
                                
                                    grpc-java
                                    io.grpc:protoc-gen-grpc-java:1.0.1
                                
                            
                        
                    
                
            

执行重新构建

$ mvn clean compile

控制台打印如下:

生成程序如下:

【JAVA】protobuf在Java中代码测试用例_第4张图片

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

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

protoc-jar-maven-plugin - Introduction

你可能感兴趣的:(JAVA语言,RPC,macos,rpc)