在做一个String转JsonObject的过程中,报了一个很恶心的错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.xf.test.TestJson.main(TestJson.java:8)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 13 more
大概意思是说,需要导包org.apache.commons.lang,我检查了下,我导入的包是org.apache.commons.lang3,lang和lang3有什么区别呢?
lang3是Apache Commons 团队发布的工具包,要求jdk版本在1.5以上,相对于lang来说完全支持java5的特性,废除了一些旧的API,但是该版本无法兼容旧有版本,于是为了避免冲突改名为lang3,所以如果需要使用旧有特性,需要引入lang(建议lang和lang3一起引入,省得麻烦)。
引入lang以后,又报了如下错误java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher:
Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher
at com.xf.test.TestJson.main(TestJson.java:8)
Caused by: java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
查了资料才知道,使用JSON,在SERVLET或者STRUTS的ACTION中取数据时候,如果出现异常:java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher,原因是少了JAR包,造成类找不到,除了要导入JSON网站上面下载的json-lib.jar包之外,还必须有其它几个依赖包:
commons-beanutils.jar
commons-httpclient.jar
commons-lang.jar
ezmorph.jar
morph-1.0.1.jar(该包不导入好像也没问题)
这个问题之前也遇到过,但是每次都少这个包或那个包,仅此记录下,避免再次遗忘:
public class TestJson {
public static void main(String[] args) {
String str = "{\"status\":0,\"result\":{\"location\":{\"lng\":116.32955083057994,\"lat\":39.971617532034439},\"formatted_address\":\"北京市海淀区南大街2号\",\"business\":\"人民大学,双安,双榆树\",\"addressComponent\":{\"country\":\"中国\",\"country_code\":0,\"country_code_iso\":\"CHN\",\"country_code_iso2\":\"CN\",\"province\":\"北京市\",\"city\":\"北京市\",\"city_level\":2,\"district\":\"海淀区\",\"town\":\"\",\"town_code\":\"\",\"adcode\":\"110108\",\"street\":\"南大街\",\"street_number\":\"2号\",\"direction\":\"附近\",\"distance\":\"11\"},\"pois\":[],\"roads\":[],\"poiRegions\":[{\"direction_desc\":\"内\",\"name\":\"数码大厦\",\"tag\":\"房地产;写字楼\",\"uid\":\"3dd9b965c5cc64b3c8213d50\",\"distance\":\"0\"}],\"sematic_description\":\"数码大厦内,华宇时尚购物中心西北66米\",\"cityCode\":131}}";
JSONObject json = JSONObject.fromObject(str);
System.out.println(json);
}
}