用maven做构建工具,进行web服务器端应用的打包。报下面错误
Msg$$JProtoBufClass.java:15: 错误: 找不到符号
在pom文件plugins中添加
<plugin>
<groupId>com.baidu</groupId>
<artifactId>jprotobuf-precompile-plugin</artifactId>
<version>1.2.8</version>
<configuration>
<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
<filterClassPackage>com.程序中.proto的路径</filterClassPackage>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>precompile</goal>
</goals>
</execution>
</executions>
</plugin>
在dependencies中添加
<!-- https://mvnrepository.com/artifact/com.baidu/jprotobuf-precompile-plugin -->
<dependency>
<groupId>com.baidu</groupId>
<artifactId>jprotobuf-precompile-plugin</artifactId>
<version>1.2.8</version>
</dependency>
然后 mvn clean package -dmaven.test.skip true,一切都可以愉快的玩耍了。
感谢这个链接: https://github.com/jhunters/jprotobuf.
项目中用到了RPC通信,序列化方式采用protobuf,当初项目的基础框架是同事做的,猜想他做到一半才发现还有jprotobuf这个东东,于是临时替换了google的原生支持,但是proto文件都还留在项目里。我完全没注意序列化用了什么方式,业务代码写完准备打包交付的时候麻烦来了,只要涉及到对外TCP通信的服务怎么打包都报错。我尝试了运行环境统一、打包插件替换、jar包版本兼容测试,最后放弃治疗,把原本gradle构建的程序转成了maven,认为一定是自己对gradle不熟导致的。一顿折腾之后才决定看看别人写的框架到底采用了什么技术选型。然后,没到半个小时问题就解决了。原因就是遗留的proto文件导致通信实体没有编译。
浪费了大半天时间得到的教训是,再好的脚手架程序也是别人的,用之前先消化好。