java - 尝试将对象从项目传递到 API 休息时出现 NoClassDefFoundError
问题描述
我的一个项目有问题。这是有关它的更多信息:
我们的老师给了我们一个包含Hadoop和Hbase的虚拟机(ubuntu) ,已经设置好了。目标很简单:我们有一个Rest api
with tomcat 8.5
(RestServer项目,web 项目),它拦截GET
请求(我们的老师只希望我们有GET
请求,显然是出于安全原因),我们需要根据url
(例如:/students/{id}/{program}
将返回此特定学生(id)和学习年份(程序)的成绩摘要,Hbase 表上的数据选择和 mapreduce 作业。我们有一个BigData项目,其中包含用于扫描和过滤Hbase
表的简单 java 代码。这是该项目的简短摘要。
这是我们用于这个项目的结构:项目结构
这里是执行逻辑:我们url
在浏览器中输入我们的,在我们启动我们的RestServer项目后(right click on RestServer
-> Run as
-> Run on server
。这是我们这样做之后得到的:浏览器中的 RestServer。
简单的部分到此为止。我们在上图中看到的链接仅用于演示,它们不是我们在这个项目中需要做的。这个想法是拦截GET
来自api的请求,在处理请求的方法中,获取参数,将它们传递给我们响应对象的构造函数的调用,并将对象作为响应返回(将转换为a JSON
) . 这个想法是从BigData项目中获取这个对象(对我们GET
请求的响应) 。所以我们需要让这两个项目进行交流。
这是拦截请求的代码:
@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项目执行代码时(as Java application
),我绝对没有问题,没有错误。但想法是使用BigData项目中的代码来构建Result1
对象,并将其“归还”给Rest api
. 问题就在这里,我尝试了所有我在互联网上知道和找到的东西,但我无法解决这个问题。当我输入我的网址时,(即:)http://localhost:8080/RestServer/v1/StudentService/students/2005000033/L3
我收到此错误:错误
根据我的研究,我发现(如果我错了,请纠正我)程序ByteArrayComparable
在runtime
. 我查看了我能找到的所有链接,这是我试图解决的问题:
- 检查Hadoop和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项目中,是在我在选项卡中添加BigData项目中的src
文件夹后创建的)。Source
Deployement Assembly
:我添加了BigData项目。- 我在我的RestServer项目的文件夹中复制了BigData项目中使用的类。
src
- 我看到这可能是由库之间的冲突引起的,所以我尝试在一个项目中删除一些并让它们进入另一个项目。
- 我在每次更改之间清理并重建了项目。
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
),你需要去,仍然在属性中,在部署程序集中(上图Java Build Path
)。在这里,您单击Add...
并添加所有 jar 文件。
解决方案
推荐阅读
- android - 如何在不将其传递给 Material 应用程序中的 home 参数的情况下向我的颤振应用程序添加底部导航
- reactjs - 如何将数组数据推送到对象上?
- verilog - 系统verilog中的通配符及其可综合性
- node.js - Azure Web App (Linux - Node v12 LTS) - 403 请求标头太长
- c# - 使用实际上是列表的类对象数组
- json - Terraform:如何通过 json 文件迭代地图输入的键值对
- reactjs - Redux 状态加载,但反应不渲染
- node.js - 在我的基于 NodeJS 的 lambda 中,无法在回调 getSignedUrl 时调用 AWS SES sendEmail 函数
- hibernate - 使用 AND/OR 组合的休眠条件
- java - 我的快速排序方法有一个基本案例,但我仍然收到堆栈溢出错误?