使用Apache Thrift的Java编译错误

使用Apache Thrift的Java编译错误,java,thrift,Java,Thrift,我正在尝试使用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.t

我正在尝试使用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
我使用

sudoapt安装节俭编译器

我使用的是Ubuntu 18.04。我还按照以下链接安装了Thrift:并提取和使用下载的文件

进一步信息
我使用Python实现了客户端,它正常工作


任何帮助都将不胜感激。

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

  • 节俭编译器
  • 旧图书馆
  • 只有一个thrift编译器,可以为所有支持的目标语言生成代码。但是,有多个thrift库,每种目标语言一个。在您的例子中,您需要thrift库的Java版本。在Ubuntu中,这是由
    libthriftjava
    包提供的

    我假设您有一个节俭协议规范
    my_协议。节俭协议包含:

    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.java
    Calculadora.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:”客户