1. 错误
Exception in thread main java.lang.NoClassDefFoundError:org/apache/axis2/client/Stub
Exception in thread main java.lang.NoClassDefFoundError:javax/mail/internet/ParseException
......
由于项目需求,我要在Linux中调用执行jar包,jar包是一个Web Service客户端程序,在Windows环境Java IDE工具Eclipse中编写,程序在Eclipse中执行正常,然而,在打包为jar文件之后执行,却出现了以上错误。
这主要是因为jar包在执行时需要用到以上类文件,但是却没有找到这些文件。
之所以在Eclipse中执行正确,是因为我们配置了工程的环境,通过build path已经将所需的类文件以jar包的形式添加到工程中。而打包为jar包之后,由于没有配置环境变量,程序不知道去哪里寻找这些类文件,所以出错。
2. 解决
解决方法有二:
a) 将以上这些类文件所在的jar包路径加入环境变量classpath中,这样在执行jar包时系统会根据classpath的值找到jar包;
b) 在打包时,将这些jar包写入MANIFEST.MF中,例如:
Manifest-Version: 1.0
Created-By: 1.6.0_45 (Sun Microsystems Inc.)
Class-Path: lib/axiom-api-1.2.13.jar lib/axiom-impl-1.2.13.jar lib/axis2-adb-1.6.2.jar lib/axis2-kernel-1.6.2.jar lib/axis2-transport-http-1.6.2.jar lib/axis2-transport-local-1.6.2.jar lib/commons-codec-1.3.jar lib/commons-httpclient-3.1.jar lib/commons-logging-1.1.1.jar lib/gson-2.1.jar lib/httpcore-4.0.jar lib/mail-1.4.jar lib/neethi-3.0.2.jar lib/wsdl4j-1.6.2.jar lib/XmlSchema-1.4.7.jar
Main-Class: iUserMgr.UserMgrMain
【注】:
将用到的这些jar文件放入lib文件夹,并且将lib文件夹和打包后的jar文件放在同一个目录下,然后执行jar包就不会出现这些问题了。
此处我用的方法二,因为要在Linux中执行jar包,第二种方法会比较方便一些。但是这种方法需要保证lib文件夹始终跟你的jar包在同一个目录下。
3. 附
Exception in thread main java.lang.NoClassDefFoundError:org/apache/axis2/client/Stub
这个类文件在axis2-kernel-1.6.2.jar中
Exception in thread main java.lang.NoClassDefFoundError:javax/mail/internet/ParseException
这个类文件在mail-1.4.jar中
一般情况下,在使用axis2生成Web Servie客户端时,需要的jar包为以下:
axiom-api-1.2.13.jar
axiom-impl-1.2.13.jar
axis2-adb-1.6.2.jar
axis2-kernel-1.6.2.jar
axis2-transport-http-1.6.2.jar
axis2-transport-local-1.6.2.jar
commons-codec-1.3.jar
commons-httpclient-3.1.jar
commons-logging-1.1.1.jar
httpcore-4.0.jar
mail-1.4.jar
neethi-3.0.2.jar
wsdl4j-1.6.2.jar
XmlSchema-1.4.7.jar
参考资料:
1. https://blog.csdn.net/MaoTongBin/article/details/10110711
2. https://bbs.csdn.net/topics/230052372