- JAVA
NoSuchMethodErrorの原因と直し方|Javaのライブラリ競合
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期連続の黒字決算。