新的JSONObject触发java.lang.NoClassDefFoundError

时间:2019-07-16 13:46:37

标签: java json jdeveloper

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


我正在解析一个URL,并且我从JSONObject正确地从Main.class 上获取了我想要的变量,没有 > 触发任何类型的Exception

这导致我得出假设,整个解析代码 正确,这意味着readJsonFromUrl 功能< / strong>发挥作用。


让我提及我的PhillPlugin.class包含的内容

  1. public ExecutionStatus process(AuthenticationContext context), 在插件运行时触发。
  2. public void getDataGenerate(String Url),在 process 函数内部调用,以根据JSONObject
  3. 创建URL getDataGenerate 函数内部调用的
  4. public static JSONObject readJsonFromUrl(String url)
  5. private static String readAll(Reader rd)用于在 readJsonFromUrl
  6. 中进行解析

现在,我将插件上传到服务器,运行并在日志中获取以下内容

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.classMain.class中)

  

org.json.jar 包含在Project的库中,以及所有 .jars 以便构建插件


  

MANIFEST.MF

Manifest-Version: 1.0
Bundle-Version: 10
Bundle-Name: PhillPlugin
Bundle-Activator: phillplugin.PhillPlugin
Bundle-ManifestVersion: 2
Import-Package: org.osgi.framework;version="1.3.0",oracle.security.am.plugin,oracle.security.am.plugin.authn,oracle.security.am.plugin.impl,oracle.security.am.plugin.api,oracle.security.am.common.utilities.principal,oracle.security.idm,javax.security.auth
Bundle-SymbolicName: PhillPlugin
CLASSPATH: felix.jar, identitystore.jar, oam-plugin.jar, utilities.jar, org.json.jar
  

PhillPlugin.Class的示例

出于安全考虑,我不应该包含该URL。 (相信我,这是有效的)

    public void getDataGenerate(String Url) {
        System.out.println("-----   Reading Json Object  -----");
                       JSONObject json;
        try {
            json = readJsonFromUrl(Url);
            System.out.println("The Json Object: "+json.toString());
            otp=Integer.parseInt((String) json.get("otp"));
            System.out.println("The User is:"+user+"\n"+"His OTP is: "+otp);
        } catch (Exception e) {
            System.out.println("Exception : "+e.toString());
        }          

    public static JSONObject readJsonFromUrl(String url) throws IOException,JSONException {
        System.out.println("Opening Stream");
        InputStream is = new URL(url).openStream();
        System.out.println("Stream opened");
        try {
         System.out.println("----------\n\n\nUrl to Parse: "+url+"\n\n\n");
          BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
          System.out.println("\n\n\n"+"BufferedReader opened\n\n\n\n");
          String jsonText =(String) readAll(rd);
          System.out.println("\n\n\nJsonTEXT:"+jsonText+"\n\n\n");
            JSONObject json=null;
            System.out.println("\n\n Created Json Instance\n\n\n");
            try{
                System.out.println("inside try statement - initializing JSONObject with the text above \n\n\n");
             //-------ERROR TRIGGERED HERE---------
             json = new JSONObject(jsonText);
                System.out.println("--------------------Object created-------------------");
            }catch (Exception e) {
                System.out.println("\n\n\n\n\nJSONOBJECT failed to be created: \n"+e);
            }
          System.out.println("\n\n\nJSON OBJECT"+json+"\n\n\n\n");
          return json;
        } finally {
          is.close();
        }

    private static String readAll(Reader rd) throws IOException {
        StringBuilder sb = new StringBuilder();
        int cp;
        while ((cp = rd.read()) != -1) {
          sb.append((char) cp);
        }
        return sb.toString();
      }

  

PhillPlugin.xml

<Plugin type="Authentication">
    <author>uid=Phill</author>
    <email>phill@oracle.com</email>
    <creationDate>12:47:00, 2019-07-11</creationDate>
    <description>Phill-Plugin Prints Hello</description>
    <configuration>
    </configuration>
</Plugin>


这是服务器日志崩溃前的输出


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文件了,因为我可能   在那里做错了事

很长的帖子,很抱歉,如果需要,我会提供任何其他信息,谢谢

2 个答案:

答案 0 :(得分:1)

Authenticaiton Plugin服务器编写OAM时,应在MANIFEST.MF中提及所有额外的库,以及外部.jar文件。

此外,所有.jar文件都应部署在最终插件.jar以及外部libraries

就我而言,我必须在导出的org.json.jar中加入PhillPlugin.jar,如下所示:

  • PhillPlugin.jar

enter image description here

如您所见org.json.jar及其库org是必需的

  • Manifest.MF

最后一步是在MANIFEST.MF中提及您在插件中使用的所有额外classes

就我而言,我必须将其包含在我的Import-Package属性中,以便能够创建JSONObject实例

org.json;resolution:=optional,
org.json.JSONObject;resolution:=optional

如果您想使用JSONArray,则必须添加以下内容:

org.json.JSONArray;resolution:=optional

以此类推。

编辑:类路径应如下所述:

Bundle-ClassPath: org.json.jar, felix.jar, identity-provider.jar, oam-plugin.jar, utilities.jar

答案 1 :(得分:0)

CLASSPATH中的MANIFEST.MF条目显然是错误的。正确的名称是Class-Path,请参见:https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

整个MANIFEST.MF文档:https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html