baidu / Jprotobuf-rpc-socket

Protobuf RPC是一种基于TCP协议的二进制RPC通信协议的Java实现
Apache License 2.0
530 stars 221 forks source link

spring boot 打出来的jar包无法执行 #27

Open Ruiyun opened 8 years ago

Ruiyun commented 8 years ago

使用 Spring Boot Initializr 创建的 1.3.0 Release POM 工程。只选取最简单的 aop 支持。并在 POM 文件中添加:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>jprotobuf-rpc-core</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>jprotobuf-rpc-core-spring</artifactId>
    <version>3.2.4</version>
</dependency>

在自动创建的DemoApplication.java 中添加如下配置代码:

@Bean
public RpcServiceExporter pbrpcServiceExporter() {
    List<Object> services = new ArrayList<>();

    // 直接import com.baidu.jprotobuf.pbrpc.EchoServiceImpl;
    services.add(new EchoServiceImpl()); 

    RpcServiceExporter exporter = new RpcServiceExporter();
    exporter.setServicePort(1031);
    exporter.setRegisterServices(services);
    exporter.setConnectTimeout(1000);

    return exporter;
}

打包执行:

mvn package
java -jar output/demo-0.0.1-SNAPSHOT.jar

异常摘要如下:

Compilation failed. class: com.baidu.bjf.remoting.protobuf.descriptor.FileDescriptorProtoPOJO$$JProtoBufClass
错误: 程序包com.google.protobuf.Descriptors不存在
xiemalin commented 8 years ago

com.google.protobuf.Descriptors 是protobuf-java这个类库中的,请确认你打的jar中是否包含这个依赖的包

Ruiyun commented 8 years ago

是的,确认 protobuf-java-2.5.0.jar 已经打包进了发布jar包的lib目录中。抱歉,想传图上了,几次都失败了。

但如果我把发布jar包解压缩,用下面的方式运行

 java --classpath ".;lib\spring-boot-starter-1.3.0.RELEASE.jar;..." DemoApplication

就一切正常。也就是说,只有整体打成一个包,用 java -jar 执行,才有上述问题。

lijunyong commented 8 years ago

@xiemalin 打成一个jar确实有问题

xiemalin commented 6 years ago

需要使用预编译的方式可以解决, 预编译插件方式使用方法见: https://github.com/jhunters/jprotobuf