求助:Java程序运行报错NoClassDefFoundError: org/apache/commons/logging/LogFactory
嘿,这个问题我之前也碰到过!本质就是你的项目缺少了Apache Commons Logging这个依赖包——从你贴的错误栈能看出来,HttpClient在初始化过程中需要用到org.apache.commons.logging.LogFactory这个类,但JVM在运行时找不到它。下面给你几种不同场景的解决办法:
如果你用Maven管理项目
直接在项目的pom.xml中添加以下依赖:
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> <!-- 可以替换成最新的稳定版本 --> </dependency>
添加后执行mvn clean install刷新依赖就行。
如果你用Gradle管理项目
在build.gradle(或build.gradle.kts)里加入依赖声明:
// Groovy语法 implementation 'commons-logging:commons-logging:1.2'
// Kotlin语法 implementation("commons-logging:commons-logging:1.2")
然后同步Gradle项目即可。
手动管理依赖(不用构建工具的情况)
如果是手动维护jar包的项目,去Apache Commons Logging的官方渠道下载对应版本的jar包,把下载好的commons-logging-x.x.jar放到项目的lib目录下,同时要确保你的IDE已经把这个jar包添加到项目的类路径中(比如IDEA里右键jar包选择"Add as Library")。
额外小提示:避免日志依赖冲突
如果你的项目已经引入了SLF4J这类日志框架,也可以用jcl-over-slf4j来替代原生的commons-logging,这样能避免日志依赖冲突。Maven依赖如下:
<dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.36</version> <!-- 匹配你的SLF4J版本 --> </dependency>
附你遇到的错误信息:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.http.conn.ssl.DefaultHostnameVerifier.(DefaultHostnameVerifier.java:82)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:955)
at Main.main(Main.java:87)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java...)
内容的提问来源于stack exchange,提问作者JohnA

