最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你解決Java項(xiàng)目開發(fā)中java.lang.NoSuchMethodError的問題

 更新時(shí)間:2025年09月22日 09:37:06   作者:網(wǎng)羅開發(fā)  
在日常 Java 開發(fā)中,大家應(yīng)該都見過報(bào)錯(cuò)java.lang.NoSuchMethodError的,本文就帶大家拆解一下問題的本質(zhì),結(jié)合實(shí)際案例演示如何排查和解決

前言

在日常 Java 開發(fā)中,大家應(yīng)該都見過這種報(bào)錯(cuò):

java.lang.NoSuchMethodError: '返回類型 包名.類名.方法名(參數(shù)列表)'

這個(gè)錯(cuò)誤看似“方法不存在”,但實(shí)際上大多數(shù)情況下方法明明寫在代碼里,IDE 編譯也能過,就是運(yùn)行時(shí)突然報(bào)錯(cuò)。本文就帶大家拆解一下問題的本質(zhì),結(jié)合實(shí)際案例演示如何排查和解決。

問題背景:編譯和運(yùn)行時(shí)依賴不一致

NoSuchMethodError 并不是說你拼寫錯(cuò)了方法,而是 運(yùn)行時(shí)環(huán)境加載的類和編譯時(shí)使用的類不一樣。

比如:

  • 你在開發(fā)時(shí)引入了 1.2 版本的依賴庫(kù),編譯時(shí)用到了其中新增的方法。
  • 但實(shí)際運(yùn)行時(shí),項(xiàng)目里加載的是 1.0 版本的依賴庫(kù),那個(gè)方法還沒被實(shí)現(xiàn)。
  • 結(jié)果:運(yùn)行時(shí)找不到方法,就報(bào) NoSuchMethodError

這個(gè)問題在 Maven / Gradle 項(xiàng)目、Spring Boot 多模塊項(xiàng)目里特別常見,因?yàn)橐蕾噦鬟f很容易導(dǎo)致版本沖突。

Demo 示例:重現(xiàn) NoSuchMethodError

我們先來(lái)寫個(gè)最小復(fù)現(xiàn)案例。

依賴庫(kù)(lib-demo v1.0)

// lib-demo v1.0
package com.example.lib;

public class HelloService {
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

新版本依賴庫(kù)(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)用新方法
    }
}

如果你在 編譯時(shí)用的是 lib-demo 1.2,一切正常。
但是運(yùn)行時(shí)只要 classpath 里加載的是 lib-demo 1.0,就會(huì)報(bào)錯(cuò):

Exception in thread "main" java.lang.NoSuchMethodError: 'java.lang.String com.example.lib.HelloService.sayHi(java.lang.String)'

如何排查

遇到這個(gè)問題,排查的思路一般分三步:

1. 檢查依賴樹

如果是 Maven 項(xiàng)目,可以用:

mvn dependency:tree

Gradle 項(xiàng)目可以用:

./gradlew dependencies

看看是不是有多個(gè)版本的 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 又帶進(jìn)來(lái)了低版本的依賴。

2. 確認(rèn)最終運(yùn)行的 JAR 包版本

即使在 pom.xml 里寫的是 1.2,運(yùn)行時(shí)可能還是加載到 1.0。

可以在運(yùn)行時(shí)加一句:

System.out.println(HelloService.class.getProtectionDomain().getCodeSource().getLocation());

這樣你就能打印出 JVM 實(shí)際加載的 HelloService 來(lái)自哪個(gè) JAR 包。

3. 清理緩存,確保依賴一致

有時(shí)候 Maven 本地倉(cāng)庫(kù)里舊版本沒更新,或者打包工具沒清理干凈。

建議執(zhí)行:

mvn clean install -U

確保本地緩存和遠(yuǎn)端一致。

解決方案

針對(duì)這種問題,常見的解決方式有幾種:

方案一:排除沖突依賴

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 來(lái)強(qiáng)制使用指定版本:

<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'
    }
}

方案三:清理并重建

有時(shí)候光是本地緩存問題,直接清理一下就能解決:

mvn dependency:purge-local-repository

或者直接刪掉 ~/.m2/repository 對(duì)應(yīng)目錄,重新構(gòu)建。

實(shí)際場(chǎng)景中的意義

我自己在做一個(gè) Spring Boot 多模塊項(xiàng)目的時(shí)候就遇到過類似的坑:

  • A 模塊用的是某個(gè)庫(kù)的 2.x 版本;
  • B 模塊因?yàn)橐蕾嚵艘粋€(gè)老庫(kù),又把 1.x 的版本帶進(jìn)來(lái)了;
  • 結(jié)果上線之后,某個(gè) API 調(diào)用直接報(bào) NoSuchMethodError,排查半天才發(fā)現(xiàn)是依賴沖突。

這種問題的危險(xiǎn)在于:編譯沒問題,運(yùn)行才炸,所以一定要養(yǎng)成上線前檢查依賴樹的習(xí)慣。

總結(jié)

java.lang.NoSuchMethodError 本質(zhì)上就是 編譯和運(yùn)行時(shí)依賴版本不一致。

解決思路:

  • 查依賴樹,看看是不是被拉了舊版本。
  • 確認(rèn)運(yùn)行時(shí)加載的 JAR 包是不是正確。
  • 必要時(shí)排除、鎖定依賴版本,并清理緩存。

這樣一套流程走下來(lái),大多數(shù)問題都能定位并解決。

到此這篇關(guān)于一文帶你解決Java項(xiàng)目開發(fā)中java.lang.NoSuchMethodError的問題的文章就介紹到這了,更多相關(guān)java.lang.NoSuchMethodError問題解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot?Web項(xiàng)目增刪改查入門實(shí)戰(zhàn)案例

    SpringBoot?Web項(xiàng)目增刪改查入門實(shí)戰(zhàn)案例

    這篇文章主要給大家介紹了關(guān)于SpringBoot?Web項(xiàng)目增刪改查入門實(shí)戰(zhàn)的相關(guān)資料,文中詳細(xì)介紹了如何實(shí)現(xiàn)新增、刪除、修改和查詢員工的功能,并使用統(tǒng)一響應(yīng)結(jié)果進(jìn)行前后端交互,需要的朋友可以參考下
    2024-11-11
  • MyBatis如何配置多sql腳本執(zhí)行

    MyBatis如何配置多sql腳本執(zhí)行

    這篇文章主要介紹了MyBatis如何配置多sql腳本執(zhí)行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 基于Java手寫一個(gè)通用的Excel導(dǎo)入和導(dǎo)出工具類

    基于Java手寫一個(gè)通用的Excel導(dǎo)入和導(dǎo)出工具類

    在日常開發(fā)中,Excel導(dǎo)入導(dǎo)出是一個(gè)非常常見的需求,雖然市面上有Apache POI、EasyExcel等優(yōu)秀的開源庫(kù),但在實(shí)際使用中,我們經(jīng)常遇到一些問題,下面我們就用Java手寫一個(gè)通用的Excel導(dǎo)入和導(dǎo)出工具類吧
    2026-05-05
  • 詳解如何繼承Mybatis中Mapper.xml文件

    詳解如何繼承Mybatis中Mapper.xml文件

    這篇文章主要為大家介紹了詳解如何繼承Mybatis中Mapper.xml文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java 在PPT中添加文本和圖片超鏈接的實(shí)現(xiàn)方法

    Java 在PPT中添加文本和圖片超鏈接的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java 在PPT中添加文本和圖片超鏈接的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • springboot配置redis過程詳解

    springboot配置redis過程詳解

    這篇文章主要介紹了springboot配置redis過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot整合mybatis-plus實(shí)現(xiàn)分頁(yè)查詢功能

    SpringBoot整合mybatis-plus實(shí)現(xiàn)分頁(yè)查詢功能

    這篇文章主要介紹了SpringBoot整合mybatis-plus實(shí)現(xiàn)分頁(yè)查詢功能,pringBoot分頁(yè)查詢的兩種寫法,一種是手動(dòng)實(shí)現(xiàn),另一種是使用框架實(shí)現(xiàn),現(xiàn)在我將具體的實(shí)現(xiàn)流程分享一下,需要的朋友可以參考下
    2023-11-11
  • 詳解java實(shí)現(xiàn)簡(jiǎn)單掃碼登錄功能(模仿微信網(wǎng)頁(yè)版掃碼)

    詳解java實(shí)現(xiàn)簡(jiǎn)單掃碼登錄功能(模仿微信網(wǎng)頁(yè)版掃碼)

    這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單掃碼登錄功能(模仿微信網(wǎng)頁(yè)版掃碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • sentinel整合ribbon與fallback流程分步講解

    sentinel整合ribbon與fallback流程分步講解

    這篇文章主要介紹了sentinel整合ribbon與fallback分步流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • JAVA如何按字節(jié)截取字符串

    JAVA如何按字節(jié)截取字符串

    這篇文章主要介紹了JAVA如何按字節(jié)截取字符串,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論

靖西县| 外汇| 稻城县| 定南县| 玉林市| 辽宁省| 两当县| 汉源县| 九龙县| 南投市| 邹平县| 洛浦县| 会宁县| 长沙县| 双辽市| 新蔡县| 裕民县| 特克斯县| 巩义市| 慈利县| 昭平县| 吴川市| 绿春县| 木里| 高清| 申扎县| 元朗区| 龙胜| 河北区| 邯郸县| 黔东| 修文县| 湟中县| 五华县| 胶州市| 溧水县| 台中市| 江陵县| 土默特左旗| 常德市| 齐齐哈尔市|