运行FTP下载JAR包时出现java.lang.NoClassDefFoundError报错求助
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory错误 这个问题我之前也碰到过,本质就是你的运行环境里缺了Apache Commons Logging这个依赖库——ftpcourier.jar在执行时需要调用这个库的日志相关类,但JVM找不到对应的class文件,所以抛出了这个异常。下面是具体的解决步骤:
1. 下载Apache Commons Logging的jar包
你需要下载对应版本的commons-logging-x.x.jar(推荐用1.2版本,和你用的JDK1.7兼容性很好)。直接去Apache Commons Logging的官方项目仓库下载就行,找适合JDK1.7的版本。
2. 修改运行命令,把依赖加入类路径
因为你用了-jar参数启动,JVM只会把ftpcourier.jar作为类路径,所以得显式把commons-logging.jar加进去。这里分两种操作方式:
方式一:找到主类后直接指定启动
打开ftpcourier.jar(用普通压缩工具就能打开),查看里面META-INF/MANIFEST.MF文件,找到Main-Class这一行的属性值,比如可能是com.ftpcourier.FtpCourierMain。然后修改命令如下:
java -cp "ftpcourier.jar;commons-logging-1.2.jar" -Demail-conf-path=d:\config com.ftpcourier.FtpCourierMain -d RCVE -h test.hostname.com -u smandal -w Password# -f /TIFR/report.xls -t d:\Local -s true -p 22 -x true
注意:如果commons-logging.jar不在当前命令执行的目录,要写上完整路径,比如d:\libs\commons-logging-1.2.jar。
方式二:把依赖放到JRE扩展目录(不推荐,但快速)
如果不想改命令,可以把commons-logging.jar复制到你的JRE的lib/ext目录下(也就是C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext),JVM会自动加载这个目录下的jar包。不过这种方式不够灵活,后续换环境还要重复操作,更推荐第一种方式。
3. 验证是否生效
运行修改后的命令,如果不再弹出NoClassDefFoundError,说明依赖已经正确加载,FTP下载任务应该就能正常执行了。要是还有类似的错误,那大概率是ftpcourier.jar还缺其他依赖,得继续排查补充。
内容的提问来源于stack exchange,提问作者Surya

