NoClassDefFoundError при попытке передать объект из проекта в API Rest - PullRequest
0 голосов
/ 12 января 2020

У меня проблема с одним из моих проектов. Вот немного больше информации об этом:

Наш учитель дал нам виртуальную машину (ubuntu), которая содержит Had oop и Hbase , уже настроенные. Цель довольно проста: у нас есть Rest api с tomcat 8.5 ( RestServer проект, веб-проект), который перехватывает GET запросов (наш учитель хочет, чтобы у нас был только GET запрос, безопасность очевидно, причина), и мы должны выполнить, в соответствии с url (например: /students/{id}/{program} вернет сводку оценок для данного конкретного учащегося (id) и год обучения (программы)), выбор данных и картографическое задание на Hbase таблицы. И у нас есть проект BigData , который содержит простой код java для сканирования и фильтрации Hbase таблицы. Вот краткая сводка проекта.

Вот структура, которую мы используем для этого проекта: структура проекта

А вот какова логика выполнения c : мы набираем наш url в браузере, после того как запустили наш проект RestServer (right click on RestServer -> Run as -> Run on server. Вот что мы получаем после этого: RestServer в браузере .

Легкая часть на этом останавливается. Ссылки, которые мы видим на предыдущем изображении, предназначены только для демонстрации, они не являются тем, что нам нужно сделать в этом проекте. Идея состоит в том, чтобы перехват запрос GET от API в методе, обрабатывающем запрос, получает параметры, передает их вызову конструктора нашего объекта ответа и возвращает объект в качестве ответа (который будет преобразован в JSON Идея состоит в том, чтобы получить этот объект (ответ на наш запрос GET) из проекта BigData . Поэтому нам нужно заставить эти 2 проекта взаимодействовать.

Вот код перехватить запрос:

    @GET
    @Path("/students/{id}/{program}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getStudent(@PathParam("id") String ID,@PathParam("program") String program) throws IOException {
        System.out.println("ID : "+ID+" program"+program);
        if (ID != null) {
            System.out.println("Non nul");
            return Response.ok(new Response1(ID,program), MediaType.APPLICATION_JSON).build();
        } else {
            return Response.status(Response.Status.NOT_FOUND).entity("Student not found: " + ID).build();
        }
    }

Объект Response1(ID,program) встроен в проект BigData . Когда я выполняю код из проекта BigData напрямую (как Java application), у меня абсолютно нет проблем, нет ошибок. Но идея состоит в том, чтобы использовать код из проекта BigData для создания объекта Result1 и «вернуть его» * ​​1053 *. Проблема здесь, я попробовал абсолютно все, что я знаю и нашел на inte rnet, но я не могу решить эту проблему. Когда я набираю свой URL (то есть: http://localhost:8080/RestServer/v1/StudentService/students/2005000033/L3), я получаю эту ошибку: ошибка

Из моего исследования я обнаружил, что (исправьте меня, если я ошибаюсь) программа не могу найти класс ByteArrayComparable в runtime. Я просмотрел все ссылки, которые смог найти, и вот что я пытался решить:

  • Проверьте, есть ли в библиотеке 1147 * и Hbase находятся в обоих проектах.
  • Проверьте, содержит ли проект hbase-client, который, как предполагается, содержит класс ByteArrayComparable (да, он есть в обоих проектах).
  • Делая right click на RestServer -> Properties -> Java Build Path:
    • Source вкладка: я добавил папку src из BigData проекта (и Папка bin, но я не могу вспомнить, где, по-моему, она находится на одной из вкладок Java Build Path).
    • Projects вкладка: я добавил проект BigData .
    • Order and Export вкладка: я проверил папку src (эта папка находится в проекте RestServer , созданном после добавления папки src из BigData проект во вкладке Source).
  • Deployement Assembly: я добавил BigData проект.
  • Я скопировал используемый класс в проекте BigData в моем * 111 3 * папка моего RestServer проекта.
  • Я видел, что это может быть вызвано конфликтом между библиотеками, поэтому я попытался удалить некоторые из них в одном проекте и пустить их в другой.
  • Я чистил и перестраивал проекты между каждым изменением.
  • Я попытался добавить импорт, который, кажется, вызывает проблему, добавив import org.apache.hadoop.hbase.filter.*; в файлы, которые участвуют в выполнении.

Я понятия не имею, что я могу сделать сейчас. У некоторых из моих друзей такая же проблема, даже если у нас нет одинакового кода, поэтому кажется, что проблема в конфигурации. На данный момент я не выполнял никакой работы с mapreduce, я просто использую Hbase java api для сканирования таблицы с некоторыми фильтрами.

Спасибо, что читаете меня, надеюсь, я найду ответ. Я буду продолжать тестировать, искать и редактировать этот пост, если найду что-нибудь.

Вот код для Response1 класса:

package bdma.bigdata.project.rest.core;

import java.io.IOException;
import org.apache.hadoop.hbase.filter.Filter.*;

public class Response1 {
    private StudentBD student;
    private Semester semesters;

    public Response1(String id, String program) throws IOException {
        System.out.println("Building student");
        this.student = new StudentBD(id);
        System.out.println("Building semester");
        this.semesters = new Semester(id,program);
    }

    @Override
    public String toString() {
        return student.toString()+" "+semesters.toString();
    }

    public static void main(String[] args) throws IOException {
        Response1 r = new Response1("2005000100", "L1");
        System.out.println("AFFICHAGE TEST");
        System.out.println(r);
    }
}

Редактировать

Мне наконец удалось решить мою проблему. Я положил решение здесь, если оно может помочь кому-то в той же ситуации, что и я, в будущем. После того, как вы связали свои 2 проекта (в разделе Java Build Path свойств проекта Rest api), вам нужно go, все еще в свойствах, в Deployment Assembly (выше Java Build Path). Здесь вы нажимаете Add... и добавляете все свои файлы jar.

...