java.lang.NoSuchMethodError は、コンパイルしたときには存在したメソッドが、実行時に読み込まれたクラスには存在しなかったときのエラーです。 ほとんどの場合、同じライブラリの別の版が実行時に使われている(ライブラリの版の競合)のが原因です。

原因 よくある状況
依存ライブラリが求める版と、実際に使われる版が違う 自分の pom.xml で直接指定した以前の版が優先され、別のライブラリが必要とする新しい版が使われない
同じライブラリの jar が2つクラスパスにある lib フォルダー・アプリケーションサーバーに以前の版の jar が残っている
コンパイルした環境と実行する環境の jar が違う 開発では新しい版、本番サーバーには以前の版が入っている

確認環境:Java 21、Apache Maven 3.9.11、Gradle 8.14.3(確認日 2026年10月11日)。メソッドを1つ追加した自作ライブラリの 1.0 と 2.0 を作って再現しました。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「NoSuchMethodErrorの原因と直し方|Javaのライブラリ競合」

再現:コンパイルは通るのに、実行で落ちる

ライブラリ 内容
textlib 1.0 pad(String) だけ
textlib 2.0 pad(String) と pad(String, int)(追加)
reportlib 1.0 textlib 2.0 に依存し、pad(String, int) を使う

アプリの pom.xml は、textlib 1.0 と reportlib 1.0 に依存しています。

<dependencies>
  <dependency><groupId>com.example</groupId><artifactId>textlib</artifactId><version>1.0</version></dependency>
  <dependency><groupId>com.example</groupId><artifactId>reportlib</artifactId><version>1.0</version></dependency>
</dependencies>
$ mvn compile        → 成功
$ java -cp ... com.example.app.Main
[見出し       ]
Exception in thread "main" java.lang.NoSuchMethodError: 'java.lang.String com.example.text.TextUtil.pad(java.lang.String, int)'
    at com.example.report.Report.line(Report.java:4)
    at com.example.app.Main.main(Main.java:7)

reportlib は textlib 2.0 でコンパイルされているのに、実行時には textlib 1.0 が使われたため、pad(String, int) が見つかりませんでした。 コンパイルは自分のコードだけを見るので通り、実行して初めて分かります。

エラー文の読み方

部分 意味
'java.lang.String ... pad(java.lang.String, int)' 見つからなかったメソッドの戻り値・クラス・引数
com.example.text.TextUtil そのメソッドがあるはずのクラス → このクラスが入っているライブラリが競合している
at com.example.report.Report.line 呼び出した側。reportlib が新しい版を求めている

原因を探す1:dependency:tree

$ mvn dependency:tree -Dverbose
com.example:app:jar:1.0
+- com.example:textlib:jar:1.0:compile
\- com.example:reportlib:jar:1.0:compile
   \- (com.example:textlib:jar:2.0:compile - omitted for conflict with 1.0)

omitted for conflict with 1.0 が、競合の印です。reportlib は textlib 2.0 を求めていますが、1.0 と競合したため 2.0 は使われませんでした。

ライブラリが多いときは、エラー文のクラスが入っているライブラリで絞り込みます。

mvn dependency:tree -Dverbose -Dincludes=com.example:textlib

Maven は「最も近い定義」を使う

Maven は、同じライブラリの複数の版があると、依存の木の中で、自分のプロジェクトに最も近い定義を使います(Apache Maven 公式ドキュメント)。版の新しさでは選びません。

定義の場所 深さ 選ばれるか
アプリの pom.xml に直接書いた textlib 1.0 1 選ばれる
reportlib を経由した textlib 2.0 2 選ばれない

Gradle で同じ依存を書くと、結果は逆でした。Gradle は競合したとき、新しいほうの版を選びます。

$ gradle dependencies --configuration runtimeClasspath
+--- com.example:textlib:1.0 -> 2.0          ← 1.0 を指定したが、2.0 が使われた
\--- com.example:reportlib:1.0
     \--- com.example:textlib:2.0

Gradle では実行も成功しました。同じ依存関係でも、Maven では落ち、Gradle では動くことがあります。

原因を探す2:どの jar から読まれたか

ビルドツールの外(アプリケーションサーバー・lib フォルダー・fat jar)で起きている場合は、実行時に実際に読み込まれた jar を確かめます。

java -verbose:class -cp ... com.example.app.Main | grep com.example.text
[0.042s][info][class,load] com.example.text.TextUtil source: file:/.../textlib/2.0/textlib-2.0.jar

コードの中で確かめるなら、次の1行です。

System.out.println(TextUtil.class.getProtectionDomain().getCodeSource().getLocation());
// file:/.../textlib/2.0/textlib-2.0.jar

同じ jar が2つあると、先にあるほうが使われる

クラスパスの順番 結果
textlib-1.0.jar:textlib-2.0.jar NoSuchMethodError
textlib-2.0.jar:textlib-1.0.jar 動く

同じクラスが複数の jar にあると、クラスパスの先にあるほうが使われました。 lib フォルダーに以前の版の jar が残っていると、置き方の順番しだいで落ちたり動いたりします。以前の版の jar を消します。

直し方

1. 自分の pom.xml の版を上げる(または直接の指定を消す)

<dependency><groupId>com.example</groupId><artifactId>textlib</artifactId><version>2.0</version></dependency>
+- com.example:textlib:jar:2.0:compile
\- com.example:reportlib:jar:1.0:compile
   \- (com.example:textlib:jar:2.0:compile - omitted for duplicate)
...
[見出し       ]
佐藤      300                      ← 実行できた

自分のコードで textlib を直接使っていないなら、直接の指定を消して、reportlib が求める版に任せる方法もあります。

2. dependencyManagement で版をそろえる

複数のモジュールやライブラリが同じものに依存するなら、dependencyManagement で版を1か所で決めます。間接的な依存(推移的な依存)の版にも効きます(Apache Maven 公式ドキュメント)。

<dependencyManagement>
  <dependencies>
    <dependency><groupId>com.example</groupId><artifactId>textlib</artifactId><version>2.0</version></dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <dependency><groupId>com.example</groupId><artifactId>textlib</artifactId></dependency>   <!-- 版は書かない -->
  <dependency><groupId>com.example</groupId><artifactId>reportlib</artifactId><version>1.0</version></dependency>
</dependencies>
+- com.example:textlib:jar:2.0:compile
\- com.example:reportlib:jar:1.0:compile
   \- (com.example:textlib:jar:2.0:compile - version managed from 2.0; omitted for duplicate)

Spring Boot を使っている場合は、Spring Boot が多くのライブラリの版を dependencyManagement(BOM)で管理しています。Spring Boot が管理しているライブラリに、自分で版を書くと競合の原因になることがあるため、版を書く前に dependency:tree で確かめます。

3. 実行環境の jar を確かめる

環境 確認すること
アプリケーションサーバー(Tomcat など) サーバーの lib フォルダーに、同じライブラリの以前の版の jar がないか
fat jar(Spring Boot の実行可能 jar など) jar の中の BOOT-INF/lib に入っている版
本番サーバー 開発と同じ版の jar が配置されているか

似たエラーとの違い

エラー 意味
NoSuchMethodError クラスはあるが、メソッドが無い(版の違い)
NoClassDefFoundError コンパイル時にあったクラスそのものが無い(jar が無い・版でクラスが消えた)
NoSuchMethodException リフレクション(getMethod)でメソッドが見つからない。例外として捕まえられる
UnsupportedClassVersionError Java の版が合わない(関連記事で解説)

確認の手順(チェックリスト)

順番 確認すること 方法
1 見つからないメソッドとクラス エラー文の '戻り値 クラス.メソッド(引数)'
2 そのクラスが入っているライブラリ パッケージ名から探す
3 競合しているか mvn dependency:tree -Dverbose -Dincludes=... の omitted for conflict
4 実際に読まれた jar java -verbose:class、getCodeSource().getLocation()
5 直す 版を上げる、直接の指定を消す、dependencyManagement
6 実行環境 lib フォルダー・サーバーに以前の版の jar がないか

よくある質問

Q. clean してビルドし直したら直ることがあります。なぜですか。 A. 以前のビルドの成果物(以前の版でコンパイルしたクラスや、コピーされた jar)が残っていると起きることがあります。clean で消えると、依存関係どおりの版でビルドし直されます。それでも出るなら、dependency:tree で競合を確かめます。

Q. Gradle では、どう調べますか。 A. gradle dependencies --configuration runtimeClasspath で依存の木を表示します。1.0 -> 2.0 のように矢印があれば、別の版に置き換えられています。特定のライブラリを調べるなら gradle dependencyInsight --dependency textlib です。

まとめ

  • コンパイル時にあったメソッドが、実行時のクラスに無い。原因はほぼライブラリの版の競合
  • mvn dependency:tree -Dverbose の omitted for conflict で競合を見つける
  • Maven は「最も近い定義」を使う。直接書いた以前の版が優先される。Gradle は新しい版を選んだ
  • 実際に読まれた jar は -verbose:class で確かめる。同じ jar が2つあると、先にあるほうが使われる
  • 直し方は版を上げる・直接の指定を消す・dependencyManagement でそろえる

参考・出典

確認日はいずれも 2026年10月11日です。

  • Apache Maven「Introduction to the Dependency Mechanism」:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「NoSuchMethodErrorの原因と直し方|Javaのライブラリ競合」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?