簡體   English   中英

使用 Apache Thrift 的 Java 編譯錯誤

[英]Java compilation errors using Apache 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.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

我安裝了節儉編譯器使用

sudo apt 安裝節儉編譯器

我正在使用 Ubuntu 18.04。 我還通過以下鏈接安裝了 Thrift: https : //thrift.apache.org/download並提取和使用make處理下載的文件。

更多信息
我使用 Python 實現了客戶端,它正常工作。

任何幫助,將不勝感激。

對於節儉,您需要兩個組件:

  1. 節儉編譯器
  2. 一個節儉的圖書館

只有一個 thrift 編譯器,它可以為所有支持的目標語言生成代碼。 然而,有多個 thrift 庫,每個目標語言一個。 在您的情況下,您需要一個 Java 版本的 thrift 庫。 在 Ubuntu 中,這是由libthrift-java包提供的。

我假設你有一個 thrift 協議規范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應該足夠了。

如果這不起作用,你將不得不點javacjar含有節儉庫文件,並且還向jar包含它的依賴文件。 我不知道jar文件將安裝在您的系統上的哪個位置,您必須搜索它。 就我而言,我從源代碼構建了 thrift 庫。 生成的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM