首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java「Cannot inherit from final class」類衝突排查:HttpClient 4.x 多版本 Jar 包導致驗證錯誤

     編輯:程式設計綜合問答

錯誤堆疊核心

Caused by: java.lang.VerifyError: Cannot inherit from final class
at org.apache.http.impl.client.DefaultHttpClient.createHttpParams(DefaultHttpClient.java:161)
at com.jp2p.yibao.util.httpclient.HttpClient4Util.(HttpClient4Util.java:88)

根因:類路徑存在多版本 HttpClient 導致「菱形繼承」驗證失敗

  • `DefaultHttpClient` (4.5.x) 繼承 `AbstractHttpClient` (4.3+)
    - 4.3 引入 `final class HttpParams`,4.5 中 `DefaultHttpClient.createHttpParams()` 返回 `HttpParams`
    - 若 classpath 同時載入 **4.2.x (無 final HttpParams) 與 4.5.x (final HttpParams)**,JVM 驗證器發現子類試圖繼承/實現不兼容的父類簽名 → `VerifyError`

排查步驟

  1. 檢視所有 HttpClient 相關 Jar:
    `mvn dependency:tree | grep httpclient` (Maven)
    `gradle dependencies --configuration compileClasspath | grep httpclient` (Gradle)
  2. 典型衝突組合:
    `httpclient-4.2.5.jar` + `httpclient-4.5.13.jar`
    `httpcore-4.2.4.jar` + `httpcore-4.4.14.jar`
  3. 統一版本 (推薦 4.5.13 最後維護版):
    <dependencyManagement>
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
      </dependency>
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>4.4.14</version>
      </dependency>
    </dependencyManagement>
  4. 排除傳遞依賴:
    <dependency>
      <groupId>com.thirdparty</groupId>
      <artifactId>some-lib</artifactId>
      <exclusions>
        <exclusion><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></exclusion>
      </exclusions>
    </dependency>
  5. 清理部署目錄:`mvn clean` / 刪除 `WEB-INF/lib` 手動複製的舊 Jar

代碼層面修正 (HttpClient4Util.java:88)

// ❌ 舊寫法 (4.2 風格)
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout);

// ✅ 4.5+ 推薦:RequestConfig + Builder 模式
RequestConfig config = RequestConfig.custom()
    .setConnectTimeout(5000)
    .setSocketTimeout(timeout)
    .setConnectionRequestTimeout(5000)
    .build();
HttpClient client = HttpClientBuilder.create()
    .setDefaultRequestConfig(config)
    .build();

避坑指南

操作風險規範
手動複製 Jar 到 WEB-INF/lib極高 (繞過依賴管理)**禁用**,全靠 Maven/Gradle
專案同時依賴 httpclient 4.2 和 4.5VerifyError / NoSuchMethodError**強制統一版本**
升級 Spring Boot 但未同步 httpclient傳遞依賴衝突查看 `dependency:tree` 確認

總結

**`VerifyError: Cannot inherit from final class` 99% 由 HttpClient 多版本共存引起**。統一依賴版本至 4.5.13、遷移至 `RequestConfig` API、啟用 `dependencyManagement` 強制版本,徹底根治。

jar包列表截圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved