JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包。
然而,这家伙在2010年出了一个2.4版本就停更了,或许是太完美了,并不会出问题了吧。
但是要使程序可以运行必须引入一下JSON-lib包同时依赖的JAR包:
commons-lang.jar(坑在这里) commons-beanutils.jar commons-collections.jar commons-logging.jar ezmorph.jar 然而由于最近升级struts2,顺便也把commons-lang.jar 升级到了3。
尼玛悲剧发生了发生了,请求Action 中有这样一段代码
public String prepay(){
try {
JSONArray array = new JSONArray();
//伪代码
message="prepay";
} catch (Exception e) {
e.printStackTrace();
message=Action.ERROR;
}
return message;
}
居然没走catch 没打印错误,真实是RI了狗了,给个提示也是可以的啊。
折腾了半天,于是用main方法测试了一下,然后打印了一下错误:
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:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at com.acts.web.pay.action.PayAction.main(PayAction.java:250)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 13 more
至于为什么在Action没有catch异常,很显然错误显示,那个异常类已经不见了,你去那里捕获???,不是Action不是catch,是它去catch谁的问题。
commons-lang版本3中居然把包名改成了 org.apache.commons.lang3,真尼玛,所以如果你想用JSON-lib 只能再加入 commons.lang。
具体原因: Apache Commons 团队发布了 Commons Lang 3.0 ,该版本完全支持 Java 5 的特性,例如泛型和可变参数,删除了废弃的 API 。因此该版本无法兼容以前的版本,包名也做了更改 org.apache.commons.lang3 。