JAR版本升级你所遇到的坑!!!

JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包。

然而,这家伙在2010年出了一个2.4版本就停更了,或许是太完美了,并不会出问题了吧。

123.png

但是要使程序可以运行必须引入一下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 。

qrcode_for_gh_bf7a27ade681_258.jpg

作者: 小柒

出处: https://blog.52itstyle.com

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(345849402@qq.com)咨询。