You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GlassFish运行Java EE应用报错:NoClassDefFoundError: org/apache/commons/logging/LogFactory

解决GlassFish中org.apache.commons.logging.LogFactory缺失错误

错误成因

这个错误的核心是Apache HttpClient组件依赖Apache Commons Logging,即便你移除了自己代码对Commons Logging的直接调用,HttpClient在初始化DefaultHostnameVerifier时仍会尝试加载LogFactory类。如果这个类既不在GlassFish的服务器类路径中,也没有被打包进你的应用部署包,就会触发ClassNotFoundException,进而导致NoClassDefFoundError。

排查遗漏点

  • 传递依赖未处理:你可能只检查了自己代码的依赖,但Maven/Gradle等构建工具会自动引入HttpClient的传递依赖(包括Commons Logging),之前的配置检查可能忽略了这一点。
  • 部署包依赖缺失:清理构建后,需确认WAR/EAR包的WEB-INF/lib(Web应用)或lib目录(EAR)中是否包含commons-logging.jar,若缺失则说明构建时未将依赖打包。
  • 类加载优先级冲突:GlassFish服务器库中若存在旧版本的Commons Logging Jar,而你的应用中打包了新版本,可能会导致类加载失败;反之若服务器和应用都没有该Jar,也会触发错误。

解决方法

方法1:显式添加并打包Commons Logging依赖

如果使用Maven,在pom.xml中添加依赖并确保打包到应用:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
    <scope>compile</scope> <!-- 确保该Jar被打包进WEB-INF/lib -->
</dependency>

重新构建部署后,检查WAR包的WEB-INF/lib目录,确认commons-logging.jar存在。

方法2:用SLF4J替代Commons Logging(避免依赖)

若不想引入Commons Logging,可使用SLF4J的桥接包,让HttpClient通过SLF4J输出日志:

  1. 添加SLF4J相关依赖并排除HttpClient的Commons Logging依赖:
<!-- SLF4J核心API -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.36</version>
</dependency>
<!-- 桥接Commons Logging到SLF4J -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.36</version>
    <scope>runtime</scope>
</dependency>
<!-- 可选:添加具体日志实现,比如logback -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>

<!-- 排除HttpClient的Commons Logging依赖 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.14</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

方法3:将Jar放入GlassFish服务器库

把commons-logging.jar复制到GlassFish的domains/[你的域名]/lib目录,重启服务器后,该域名下的所有应用都能访问这个类。但这种方式可能引发多应用的版本冲突,不推荐在多应用部署场景使用。

内容的提问来源于stack exchange,提问作者Miguel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:57:13