新的JSONObject触发java.lang.NoClassDefFoundError
我正在使用JDeveloper IDE为Java语言中的OAM(Oracle Access Manager)开发一个自定义身份验证插件新的JSONObject触发java.lang.NoClassDefFoundError,java,json,jdeveloper,Java,Json,Jdeveloper,我正在使用JDeveloper IDE为Java语言中的OAM(Oracle Access Manager)开发一个自定义身份验证插件 我正在解析一个URL,我从JSONObject中正确地获得了所需的变量,该变量位于Main.class文件上,无需触发任何类型的异常 这导致我假设整个解析代码是正确的,这意味着readJsonFromUrl函数可以完成这项工作 让我谈谈我的PhillPlugin.class包含的内容 公共执行状态进程(AuthenticationContext), 在插件运
我正在解析一个
URL
,我从JSONObject
中正确地获得了所需的变量,该变量位于Main.class
文件上,无需触发任何类型的异常
这导致我假设整个解析代码是正确的,这意味着readJsonFromUrl
函数可以完成这项工作
让我谈谈我的PhillPlugin.class
包含的内容
公共执行状态进程(AuthenticationContext)
,
在插件运行时触发
public void getDataGenerate(String Url)
,在过程中调用函数,从Url
公共静态JSONObject readJsonFromUrl(字符串url)
在getDataGenerate函数中调用
private static String readAll(Reader rd)
用于解析内部的readJsonFromUrl
现在我将插件上传到服务器,运行插件并在其日志中获取以下内容
java.lang.NoClassDefFoundError: org/json/JSONObject
at phillplugin.PhillPlugin.readJsonFromUrl(PhillPlugin.java:184)
at phillplugin.PhillPlugin.getDataGenerate(PhillPlugin.java:132)
at phillplugin.PhillPlugin.process(PhillPlugin.java:63)
创建插件需要什么:
PhillPlugin.class
PhillPlugin.xml
MANIFEST.MF
我之所以提到上述内容,是因为我必须在这些文件的某个地方包含org.json
路径。(它已作为导入存在于PhillPlugin.class
和Main.class
)
为了构建插件,org.json.jar包含在项目的库以及所有.jar中
MANIFEST.MF
PhillPlugin.Class的示例
java.lang.NoClassDefFoundError: org/json/JSONObject
at phillplugin.PhillPlugin.readJsonFromUrl(PhillPlugin.java:184)
at phillplugin.PhillPlugin.getDataGenerate(PhillPlugin.java:132)
at phillplugin.PhillPlugin.process(PhillPlugin.java:63)
出于安全目的,我不应该包含URL。(相信我,这是有效的)
public void getDataGenerate(字符串Url){
System.out.println(“----读取Json对象---”);
JSONObject json;
试一试{
json=readJsonFromUrl(Url);
System.out.println(“Json对象:+Json.toString());
otp=Integer.parseInt((字符串)json.get(“otp”);
System.out.println(“用户是:“+User+”\n“+”他的OTP是:“+OTP”);
}捕获(例外e){
System.out.println(“异常:+e.toString());
}
公共静态JSONObject readJsonFromUrl(字符串url)引发IOException,JSONException{
System.out.println(“开始流”);
InputStream is=新URL(URL).openStream();
System.out.println(“流打开”);
试一试{
System.out.println(“-----------\n\n\nUrl要分析:“+url+”\n\n\n”);
BufferedReader rd=新的BufferedReader(新的InputStreamReader(is,Charset.forName(“UTF-8”));
System.out.println(“\n\n\n”+”BufferedReader已打开\n\n\n”);
字符串jsonText=(字符串)readAll(rd);
System.out.println(“\n\n\nJsonTEXT:+jsonText+”\n\n\n”);
JSONObject json=null;
System.out.println(“\n\n创建的Json实例\n\n\n”);
试一试{
System.out.println(“内部try语句-使用上面的文本初始化JSONObject\n\n”);
//-------此处触发错误---------
json=新的JSONObject(jsonText);
System.out.println(“-------------------创建的对象-----------------”;
}捕获(例外e){
System.out.println(“\n\n\n\n\nJSONOBJECT创建失败:\n”+e);
}
System.out.println(“\n\n\nJSON对象”+json+”\n\n\n”);
返回json;
}最后{
is.close();
}
私有静态字符串readAll(读取器rd)引发IOException{
StringBuilder sb=新的StringBuilder();
int-cp;
而((cp=rd.read())!=-1){
sb.追加((char)cp);
}
使某人返回字符串();
}
PhillPlugin.xml
uid=Phill
phill@oracle.com
12:47:00, 2019-07-11
菲尔:你好
这是崩溃前服务器日志上的输出:
Stream opened
----------
Url to Parse: https://something
BufferedReader opened
JsonTEXT: it's correct
Created Json Instance
inside try statement - initializing JSONObject with the text above
我太担心MANIFEST.MF
文件了,因为我可能
在那里做错了什么
很抱歉发了这么长的帖子,如果需要,我会提供任何额外的信息,谢谢清单中的类路径
条目。MF
显然是错误的。正确的名称是类路径
请参阅:
整个MANIFEST.MF文档:为OAM
服务器编写authenticationon插件时,应在MANIFEST.MF
以及外部.jar
文件中提及所有额外的库
此外,所有.jar
文件都应该部署在最终的插件.jar
以及外部库中
在我的例子中,我必须在导出的PhillPlugin.jar
中包含org.json.jar
,如下所示:
Bundle-ClassPath: org.json.jar, felix.jar, identity-provider.jar, oam-plugin.jar, utilities.jar
- PhillPlugin.jar
正如您所看到的,org.json.jar
及其库org
都是必需的
- Manifest.MF
最后一步是在MANIFEST.MF
中提到插件中使用的所有额外类
在我的例子中,为了能够创建一个JSONObject
实例,我必须将它包括在我的Import包
属性中
org.json;resolution:=optional,
org.json.JSONObject;resolution:=optional
如果要使用JSONArray
,必须添加以下内容:
org.json.JSONArray;resolution:=optional
等等