我正在使用 JDeveloper IDE 为Java语言的 OAM(Oracle Access Manager)开发自定义身份验证插件。
我正在解析一个URL
,并且我从JSONObject
正确地从Main.class
上获取了我想要的变量,没有 > 触发任何类型的Exception
这导致我得出假设,整个解析代码 正确,这意味着readJsonFromUrl
功能< / strong>发挥作用。
让我提及我的PhillPlugin.class
包含的内容
public ExecutionStatus process(AuthenticationContext context)
,
在插件运行时触发。public void getDataGenerate(String Url)
,在 process 函数内部调用,以根据JSONObject
URL
在 getDataGenerate 函数内部调用的public static JSONObject readJsonFromUrl(String url)
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 包含在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
文件了,因为我可能 在那里做错了事
很长的帖子,很抱歉,如果需要,我会提供任何其他信息,谢谢
答案 0 :(得分:1)
为Authenticaiton Plugin
服务器编写OAM
时,应在MANIFEST.MF
中提及所有额外的库,以及外部.jar
文件。
此外,所有.jar
文件都应部署在最终插件.jar
以及外部libraries
就我而言,我必须在导出的org.json.jar
中加入PhillPlugin.jar
,如下所示:
如您所见org.json.jar
及其库org
是必需的
最后一步是在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