新的JSONObject触发java.lang.NoClassDefFoundError

新的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), 在插件运

我正在使用JDeveloper IDE为Java语言中的OAM(Oracle Access Manager)开发一个自定义身份验证插件


我正在解析一个
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
    
    等等