使用 Apache Thrift 的 Java 编译错误

Posted

技术标签:

【中文标题】使用 Apache Thrift 的 Java 编译错误【英文标题】:Java compilation errors using Apache Thrift 【发布时间】:2020-03-24 18:06:08 【问题描述】:

我正在尝试为使用 Apache Thrift 的服务器和客户端使用不同的语言。我用 Python 编写了服务器,它运行起来没有任何问题。我尝试用Java实现客户端,如下:

import org.apache.thrift.TException;
import org.apache.thrift.transport.TSSLTransportFactory;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TSSLTransportFactory.TSSLTransportParameters;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;

public class Cliente 
    public static void main() 
        try 
            TTransport transport;

            transport = new TSocket("localhost", 9090);
            transport.open();

            TProtocol protocol = new  TBinaryProtocol(transport);
            Calculadora.Client client = new Calculadora.Client(protocol);

            perform(client);

            transport.close();

         catch (TException x) 
        x.printStackTrace();
        
    

    private static void perform(Calculadora.Client client) throws TException 
        System.out.println("Hacemos ping al servidor");
        client.ping();

        // Arrays
        int[] a1 = 2, 5, 9, 6;
        int[] a2 = 1, 3, 4, 10;
        int[] a3 = 2, 1, 3, 4;
        int[] a4 = 5, 7, 5, 4;

        // Array para el producto vectorial
        int[] v1 = 3, 1, 7;
        int[] v2 = 7, 4, 4;

        // Matrices
        int[][] m1 = 3, 1, 7, 8, 3, 6, 8, 5, 2;
        int[][] m2 = 2, 5, 7, 4, 9, 3, 1, 9, 7;

        int suma = client.suma(7, 2);
        System.out.println("7+2=" + suma);

        int resta = client.resta(2, 5);
        System.out.println("2-5=" + resta);

        int multp = client.multp(4, 8);
        System.out.println("4*8=" + multp);

        int dividir = client.dividir(9, 2);
        System.out.println("9/2=" + dividir);

        int potencia = client.power(7, 3);
        System.out.println("7^3=" + potencia);

        int modulo = client.modulo(7, 4);
        System.out.println("7%4=" + modulo);

        int[] res1 = client.sumavec(a1, a2);
        System.out.println(res1);

        int[] res2 = client.multpvez(a3, a4);
        System.out.println(res2);

        int[] res3 = client.productovec(v1, v2);
        System.out.println(res3);

        int[][] res4 = client.sumamatrices(m1, m2);
        System.out.println(res4);
     
    

我正在尝试使用以下方法编译 Java 文件:

javac -cp lib/Cliente.java

我收到以下错误:

Cliente.java:1: error: package org.apache.thrift does not exist
import org.apache.thrift.TException;
                        ^
Cliente.java:2: error: package org.apache.thrift.transport does not exist
import org.apache.thrift.transport.TSSLTransportFactory;
                                  ^
Cliente.java:3: error: package org.apache.thrift.transport does not exist
import org.apache.thrift.transport.TTransport;
                                  ^
Cliente.java:4: error: package org.apache.thrift.transport does not exist
import org.apache.thrift.transport.TSocket;
                                  ^
Cliente.java:5: error: package org.apache.thrift.transport.TSSLTransportFactory does not exist
import org.apache.thrift.transport.TSSLTransportFactory.TSSLTransportParameters;
                                                       ^
Cliente.java:6: error: package org.apache.thrift.protocol does not exist
import org.apache.thrift.protocol.TBinaryProtocol;
                                 ^
Cliente.java:7: error: package org.apache.thrift.protocol does not exist
import org.apache.thrift.protocol.TProtocol;
                                 ^
Cliente.java:29: error: package Calculadora does not exist
    private static void perform(Calculadora.Client client) throws TException 
                                           ^
Cliente.java:29: error: cannot find symbol
    private static void perform(Calculadora.Client client) throws TException 
                                                                  ^
  symbol:   class TException
  location: class Cliente
Cliente.java:12: error: cannot find symbol
            TTransport transport;
            ^
  symbol:   class TTransport
  location: class Cliente
Cliente.java:14: error: cannot find symbol
            transport = new TSocket("localhost", 9090);
                            ^
  symbol:   class TSocket
  location: class Cliente
Cliente.java:17: error: cannot find symbol
            TProtocol protocol = new  TBinaryProtocol(transport);
            ^
  symbol:   class TProtocol
  location: class Cliente
Cliente.java:17: error: cannot find symbol
            TProtocol protocol = new  TBinaryProtocol(transport);
                                      ^
  symbol:   class TBinaryProtocol
  location: class Cliente
Cliente.java:18: error: package Calculadora does not exist
            Calculadora.Client client = new Calculadora.Client(protocol);
                       ^
Cliente.java:18: error: package Calculadora does not exist
            Calculadora.Client client = new Calculadora.Client(protocol);
                                                       ^
Cliente.java:24: error: cannot find symbol
         catch (TException x) 
                 ^
  symbol:   class TException
  location: class Cliente
16 errors

我安装了 thrift 编译器使用

sudo apt install thrift-compiler

我使用的是 Ubuntu 18.04。我还通过此链接安装了 Thrift:https://thrift.apache.org/download 并在下载的文件上提取和使用 make

更多信息 我使用 Python 实现了客户端,它正常工作。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

对于节俭,您需要两个组件:

    thrift 编译器 一个旧图书馆

只有一个 thrift 编译器,它可以为所有受支持的目标语言生成代码。然而,有多个 thrift 库,每个目标语言一个。在您的情况下,您需要 Java 版本的 thrift 库。在 Ubuntu 中,这是由 libthrift-java 包提供的。

我假设你有一个节俭协议规范 my_protocol.thrift 包含:

service Calculadora 
  void ping();
  i32 suma(1: i32 a, 2: i32 b);
  ...

然后您将使用 thrift 编译器从以下位置生成 Java 代码:thrift --gen java my_protocol.thrift。这将创建./gen-java/Calculadora.java

现在您可以将Client.javaCalculadora.java 一起编译。根据您安装 thrift 库的方式,javac 可能会自动找到它。在这种情况下,javac Client.java ./gen-java/Calculadora.java 就足够了。

如果这不起作用,您必须将 javac 指向包含 thrift 库的 jar 文件,以及包含其依赖项的 jar 文件。我不知道jar 文件将安装在您的系统上的哪个位置,您必须搜索它。就我而言,我从源代码构建节俭库。生成的jar 位于./thrift/buildoutput/lib/java/build/libs/libthrift-0.14.0.jar,依赖关系位于./thrift/buildoutput/lib/java/build/deps/。然后我编译:

javac -cp "./thrift/buildoutput/lib/java/build/deps/*:thrift/buildoutput/lib/java/build/libs/libthrift-0.14.0.jar:." Cliente.java gen-java/Calculadora.java

要运行您的客户端,您可以使用:

java -cp "./thrift/buildoutput/lib/java/build/deps/*:thrift/buildoutput/lib/java/build/libs/libthrift-0.14.0.jar:." Cliente

【讨论】:

以上是关于使用 Apache Thrift 的 Java 编译错误的主要内容,如果未能解决你的问题,请参考以下文章

Apache Thrift 加密 - Java

Java分布式RPC通信框架Apache Thrift 使用总结

Apache Thrift系列详解- 概述与入门

Apache Thrift 的使用

Apache Thrift学习之二(基础及原理)

如何将所有.thrift文件(* .thrift)编译为Maven阶段?