【问题标题】:Unable to get google bigquery and google app engine to work无法让谷歌 bigquery 和谷歌应用引擎工作
【发布时间】:2016-06-08 01:08:22
【问题描述】:

找到了我的问题的答案:对于那些有同样问题的人。

回答:使用 HTTP servlet 时,我需要将 jars 放在 WEB-INF/lib 目录中。否则我可以将它们保存在 java 构建路径(库)下。因此在 eclispe 中,右键单击 lib,然后添加 Google API 并选择 BigQuery。

我正在用大查询测试谷歌应用引擎。

当我将它作为应用程序运行时,我能够在 Eclipse 中很好地运行大查询,但是当我将它作为 HttpServlet 运行时,我不断收到以下错误!

java.lang.NoClassDefFoundError: com/google/api/client/json/JsonFactory

以下是我正在使用的确切代码。

package com.hw3.test;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;

import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;

import com.google.api.services.bigquery.Bigquery;
import com.google.api.services.bigquery.BigqueryScopes;
import com.google.api.services.bigquery.model.GetQueryResultsResponse;
import com.google.api.services.bigquery.model.QueryRequest;
import com.google.api.services.bigquery.model.QueryResponse;
import com.google.api.services.bigquery.model.TableCell;
import com.google.api.services.bigquery.model.TableRow;

import java.io.IOException;
import javax.servlet.http.*;
import java.util.List;
import java.util.Scanner;

@SuppressWarnings("serial")
public class HelloWord3Servlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {


        Bigquery bigquery = createAuthorizedClient();  //If i comment this out i will get the text below, else i get the error from the title.

        resp.setContentType("text/plain");
        resp.getWriter().println("\nQuery Results:\n------------\n");

    }

    private static List<TableRow> executeQuery(String querySql, Bigquery bigquery, String projectId)
            throws IOException {
        QueryResponse query = bigquery.jobs().query(projectId, new QueryRequest().setQuery(querySql)).execute();

        // Execute it
        GetQueryResultsResponse queryResult = bigquery.jobs()
                .getQueryResults(query.getJobReference().getProjectId(), query.getJobReference().getJobId()).execute();

        return queryResult.getRows();
    }

    public static Bigquery createAuthorizedClient() throws IOException {
        // Create the credential
        HttpTransport transport = new NetHttpTransport();
        JsonFactory jsonFactory = new JacksonFactory();
        GoogleCredential credential = GoogleCredential.getApplicationDefault(transport, jsonFactory);

        // Depending on the environment that provides the default credentials
        // (e.g. Compute Engine, App
        // Engine), the credentials may require us to specify the scopes we need
        // explicitly.
        // Check for this case, and inject the Bigquery scope if required.
        if (credential.createScopedRequired()) {
            credential = credential.createScoped(BigqueryScopes.all());
        }

        return new Bigquery.Builder(transport, jsonFactory, credential).setApplicationName("Bigquery Samples").build();
    }

    public static void main(String[] args) throws IOException {
        Scanner sc;
        if (args.length == 0) {
            // Prompt the user to enter the id of the project to run the queries
            // under
            System.out.print("Enter the project ID: ");
            sc = new Scanner(System.in);
        } else {
            sc = new Scanner(args[0]);
        }
        String projectId = sc.nextLine();

        // Create a new Bigquery client authorized via Application Default
        // Credentials.
        Bigquery bigquery = createAuthorizedClient();

        List<TableRow> rows = executeQuery(
                "SELECT TOP(corpus, 10) as title, COUNT(*) as unique_words " + "FROM [publicdata:samples.shakespeare]",
                bigquery, projectId);

         printResults(rows);
    }

    private static void printResults(List<TableRow> rows) {
        System.out.print("\nQuery Results:\n------------\n");
        for (TableRow row : rows) {
            for (TableCell field : row.getF()) {
                System.out.printf("%-50s", field.getV());
            }
            System.out.println();
        }
    }
}

我直接从谷歌网站获得了这段代码,虽然我做了一些修改,以便我可以测试应用程序引擎。但是在使用应用引擎时将无法正常工作。

非常感谢任何帮助!

【问题讨论】:

  • 日志是否显示超时错误?你不能使用一个前端实例超过 30 秒
  • 它立即失败。提醒:如果我将它作为应用程序运行它工作正常,但一旦我尝试将它作为 http servlet 运行它就会失败。

标签: google-app-engine google-bigquery


【解决方案1】:

当您作为 HttpServlet 运行时,听起来依赖项配置不正确。你如何告诉你的应用程序使用哪些依赖项?您要加载哪个版本?该版本在 Google App Engine 中可用吗?

请注意,您需要的 jackson 库的特定版本会根据您运行的环境而有所不同。请参阅 https://developers.google.com/api-client-library/java/google-http-java-client/setup 了解您在各种环境中所需的依赖项列表。

【讨论】:

  • 嘿迈克尔,感谢您的回复,我认为同一个人否决了我的问题和您的回答。有个叫贾罗德·罗伯逊的人。我将检查您提到的 Java 的 HTTP 客户端库和版本。我会让你知道。谢谢!
  • 嘿,我想通了。使用 HTTP servlet 时,我需要将 jars 放在 WEB-INF/lib 目录中。否则我可以将它们保存在 java 构建路径(库)下。感谢您的帮助。
【解决方案2】:

回答:使用 HTTP servlet 时,我需要将 jars 放在 WEB-INF/lib 目录中。否则我可以将它们保留在 java 构建路径(库)下。因此在 eclispe 中,右键单击 lib,然后添加 Google API 并选择 BigQuery。

【讨论】:

    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多