一文帶你解決Java項目開發(fā)中java.lang.NoSuchMethodError的問題
前言
在日常 Java 開發(fā)中,大家應(yīng)該都見過這種報錯:
java.lang.NoSuchMethodError: '返回類型 包名.類名.方法名(參數(shù)列表)'
這個錯誤看似“方法不存在”,但實際上大多數(shù)情況下方法明明寫在代碼里,IDE 編譯也能過,就是運行時突然報錯。本文就帶大家拆解一下問題的本質(zhì),結(jié)合實際案例演示如何排查和解決。
問題背景:編譯和運行時依賴不一致
NoSuchMethodError 并不是說你拼寫錯了方法,而是 運行時環(huán)境加載的類和編譯時使用的類不一樣。
比如:
- 你在開發(fā)時引入了 1.2 版本的依賴庫,編譯時用到了其中新增的方法。
- 但實際運行時,項目里加載的是 1.0 版本的依賴庫,那個方法還沒被實現(xiàn)。
- 結(jié)果:運行時找不到方法,就報
NoSuchMethodError。
這個問題在 Maven / Gradle 項目、Spring Boot 多模塊項目里特別常見,因為依賴傳遞很容易導(dǎo)致版本沖突。
Demo 示例:重現(xiàn) NoSuchMethodError
我們先來寫個最小復(fù)現(xiàn)案例。
依賴庫(lib-demo v1.0)
// lib-demo v1.0
package com.example.lib;
public class HelloService {
public String sayHello(String name) {
return "Hello " + name;
}
}
新版本依賴庫(lib-demo v1.2)
// lib-demo v1.2
package com.example.lib;
public class HelloService {
public String sayHello(String name) {
return "Hello " + name;
}
// 新增方法
public String sayHi(String name) {
return "Hi " + name;
}
}
主程序
package com.example.app;
import com.example.lib.HelloService;
public class Main {
public static void main(String[] args) {
HelloService service = new HelloService();
System.out.println(service.sayHi("Tom")); // 調(diào)用新方法
}
}
如果你在 編譯時用的是 lib-demo 1.2,一切正常。
但是運行時只要 classpath 里加載的是 lib-demo 1.0,就會報錯:
Exception in thread "main" java.lang.NoSuchMethodError: 'java.lang.String com.example.lib.HelloService.sayHi(java.lang.String)'
如何排查
遇到這個問題,排查的思路一般分三步:
1. 檢查依賴樹
如果是 Maven 項目,可以用:
mvn dependency:tree
Gradle 項目可以用:
./gradlew dependencies
看看是不是有多個版本的 lib-demo 被引入了。
例如:
[INFO] +- com.example:lib-demo:jar:1.2:compile
[INFO] \- com.other:some-lib:jar:1.0:compile
\- com.example:lib-demo:jar:1.0:compile
很明顯,some-lib 又帶進來了低版本的依賴。
2. 確認最終運行的 JAR 包版本
即使在 pom.xml 里寫的是 1.2,運行時可能還是加載到 1.0。
可以在運行時加一句:
System.out.println(HelloService.class.getProtectionDomain().getCodeSource().getLocation());
這樣你就能打印出 JVM 實際加載的 HelloService 來自哪個 JAR 包。
3. 清理緩存,確保依賴一致
有時候 Maven 本地倉庫里舊版本沒更新,或者打包工具沒清理干凈。
建議執(zhí)行:
mvn clean install -U
確保本地緩存和遠端一致。
解決方案
針對這種問題,常見的解決方式有幾種:
方案一:排除沖突依賴
在 pom.xml 里明確排除掉低版本依賴:
<dependency>
<groupId>com.other</groupId>
<artifactId>some-lib</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.example</groupId>
<artifactId>lib-demo</artifactId>
</exclusion>
</exclusions>
</dependency>
方案二:鎖定依賴版本
使用 Maven 的 <dependencyManagement> 或 Gradle 的 resolutionStrategy 來強制使用指定版本:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>lib-demo</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</dependencyManagement>
Gradle:
configurations.all {
resolutionStrategy {
force 'com.example:lib-demo:1.2'
}
}
方案三:清理并重建
有時候光是本地緩存問題,直接清理一下就能解決:
mvn dependency:purge-local-repository
或者直接刪掉 ~/.m2/repository 對應(yīng)目錄,重新構(gòu)建。
實際場景中的意義
我自己在做一個 Spring Boot 多模塊項目的時候就遇到過類似的坑:
- A 模塊用的是某個庫的 2.x 版本;
- B 模塊因為依賴了一個老庫,又把 1.x 的版本帶進來了;
- 結(jié)果上線之后,某個 API 調(diào)用直接報
NoSuchMethodError,排查半天才發(fā)現(xiàn)是依賴沖突。
這種問題的危險在于:編譯沒問題,運行才炸,所以一定要養(yǎng)成上線前檢查依賴樹的習(xí)慣。
總結(jié)
java.lang.NoSuchMethodError 本質(zhì)上就是 編譯和運行時依賴版本不一致。
解決思路:
- 查依賴樹,看看是不是被拉了舊版本。
- 確認運行時加載的 JAR 包是不是正確。
- 必要時排除、鎖定依賴版本,并清理緩存。
這樣一套流程走下來,大多數(shù)問題都能定位并解決。
到此這篇關(guān)于一文帶你解決Java項目開發(fā)中java.lang.NoSuchMethodError的問題的文章就介紹到這了,更多相關(guān)java.lang.NoSuchMethodError問題解決內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Maven包沖突導(dǎo)致NoSuchMethodError錯誤的解決辦法
- 詳解Matisse與Glide--java.lang.NoSuchMethodError:com.bumptech.glide.RequestManager.load
- Java異常 Factory method''sqlSessionFactory''rew exception;ested exception is java.lang.NoSuchMethodError:
- 解決啟動Azkaban報錯問題:java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap
- 解決 java.lang.NoSuchMethodError的錯誤
相關(guān)文章
java使用異或?qū)崿F(xiàn)變量互換和異或加密解密示例
這篇文章主要介紹了使用異或?qū)崿F(xiàn)變量互換和異或加密解密示例,需要的朋友可以參考下2014-02-02
Java實現(xiàn)字符串與基本數(shù)據(jù)類型轉(zhuǎn)換的全面指南
本文詳細介紹了Java中字符串與基本數(shù)據(jù)類型之間轉(zhuǎn)換的方法,包括將字符串轉(zhuǎn)換為基本數(shù)據(jù)類型,以及將基本數(shù)據(jù)類型轉(zhuǎn)換為字符串的各種技術(shù),有需要的小伙伴可以了解下2025-09-09
IDEA下Servlet可能出現(xiàn)404的一些情況
相信有很多小伙伴遇到報錯都不知道怎么處理,今天特地整理了這篇文章,文中對IDEA下Servlet可能出現(xiàn)404的一些情況作了詳細的介紹,需要的朋友可以參考下2021-06-06

