0

Found the answer to my question: For those having the same problem.

ANSWER: When working with HTTP servlets i needed to have the jars within the WEB-INF/lib directory. Else i could just keep them under the java build path (libraries). Thus in eclispe, right click on lib, then Add Google API's and the select BigQuery.

I am testing out google app engine with big query.

I am able to run big query fine in eclipse when I run it as an app, however when i run it as an HttpServlet i keep getting the following error!

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

Below is the exact code I am using.

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();
        }
    }
}

I got this code directly from the google website although i did modify it slightly so that i can test out app engine. However it will not work when using app engine.

Any help is greatly appreciated!

ADL
  • 2,707
  • 1
  • 16
  • 23
  • do the logs show timeout errors? you cant use a frontend instance for over 30 seconds – Zig Mandel May 09 '16 at 23:04
  • It fails immediately. Reminder: it works fine if I run it as the app, but as soon as i try to run it as a http servlet it fails. – ADL May 09 '16 at 23:07

2 Answers2

1

It sounds like dependencies aren't configured correctly when you are running as an HttpServlet. How do you tell your app which dependencies to use? What version are you trying to load? Is that version available in Google App Engine?

Note that the specific version of the jackson libraries you require change depending on what environment you are running in. See https://developers.google.com/api-client-library/java/google-http-java-client/setup for a list of dependencies you need in various environments.

Michael Sheldon
  • 2,027
  • 11
  • 7
  • Hey Michael, thanks for the response, i think the same person down voted my question and your answer. Some guy called Jarrod Roberson. I will check out the HTTP client library for Java as you mentioned and the versions. I will let you know. Thanks! – ADL May 11 '16 at 18:19
  • Hey i figured it out. When working with HTTP servlets i needed to have the jars within the WEB-INF/lib directory. Else i could just keep them under the java build path (libraries). Thanks for your help. – ADL May 11 '16 at 19:30
0

ANSWER: When working with HTTP servlets i needed to have the jars within the WEB-INF/lib directory. Else i could just keep them under the java build path (libraries). Thus in eclispe, right click on lib, then Add Google API's and the select BigQuery.

ADL
  • 2,707
  • 1
  • 16
  • 23