ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|---|
|
エラーの状況
Exception in thread "main" java.lang.NoSuchMethodError:
'java.lang.String org.apache.commons.lang3.StringUtils.toRootUpperCase(java.lang.String)'
at com.example.MyClass.process(MyClass.java:42)
at com.example.Main.main(Main.java:10)
# クラス自体は見つかっているが、そのメソッドだけがない
# → クラスパスのバージョン不整合が大半
原因と対処
原因 1: 同じライブラリの異なるバージョンが共存
# Maven の依存関係を可視化
$ mvn dependency:tree
[INFO] +- org.springframework.boot:spring-boot-starter-web:3.1.0
[INFO] | +- org.apache.commons:commons-lang3:3.12.0 ← バージョン A
[INFO] +- com.example:legacy-lib:1.0
[INFO] +- org.apache.commons:commons-lang3:3.5 ← バージョン B (古い)
# → ClassLoader はどちらかを優先するが、古い方が先に来ると新 API メソッドがない
# 詳細表示
$ mvn dependency:tree -Dverbose
# 衝突解消: exclusion で古い方を除外
<dependency>
<groupId>com.example</groupId>
<artifactId>legacy-lib</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>
原因 2: API 変更で削除されたメソッドを使用
// 古い API (削除済み)
StringUtils.isBlank(str); // 残っている
StringUtils.toUpperCase(str); // 削除されて toRootUpperCase に
// 修正: 新 API を使う or 古いバージョンに戻す
StringUtils.toRootUpperCase(str);
# Maven バージョン固定
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
原因 3: コンパイル時と実行時で別バージョン
# ビルド時: 新バージョン (新 API 含む) でコンパイル成功
# 実行時: 古いバージョンが classpath にあり、その API がない
# 対処
# 1. 依存ツリー確認
$ mvn dependency:tree | grep commons-lang3
# 2. 全推移依存を固定 (dependencyManagement)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version> <!-- 全体で固定 -->
</dependency>
</dependencies>
</dependencyManagement>
原因 4: Tomcat / Web サーバの shared lib と war の lib 重複
# Tomcat
# $CATALINA_HOME/lib/ ← shared (古いバージョン)
# myapp.war / WEB-INF/lib/ ← アプリ専用 (新バージョン)
# 通常 webapp の lib が優先されるが、ClassLoader 設定次第で逆になる
# context.xml で classLoader を確認
<Context>
<Loader delegate="false"/> <!-- ← webapp 優先 (デフォルト) -->
</Context>
# または共有 lib から古い jar を削除
クラスパス確認
// 実行時にロードされた jar のパスを確認
public class ClasspathInspector {
public static void main(String[] args) {
ClassLoader cl = ClasspathInspector.class.getClassLoader();
try {
// 特定クラスがどこから来ているか
URL url = cl.getResource("org/apache/commons/lang3/StringUtils.class");
System.out.println("StringUtils from: " + url);
// メソッド一覧確認
Class<?> c = Class.forName("org.apache.commons.lang3.StringUtils");
for (Method m : c.getMethods()) {
System.out.println(m);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
# 実行
$ java -cp ... ClasspathInspector
StringUtils from: jar:file:/path/to/commons-lang3-3.5.jar!/org/apache/...
jar 内のクラスを直接確認
# jar 内のクラス一覧
$ jar tf commons-lang3-3.12.0.jar | grep StringUtils
org/apache/commons/lang3/StringUtils.class
# クラスのメソッド一覧
$ unzip -p commons-lang3-3.12.0.jar org/apache/commons/lang3/StringUtils.class > tmp.class
$ javap tmp.class | grep "public static"
# 期待のメソッドがあるか
$ javap tmp.class | grep "toRootUpperCase"
public static java.lang.String toRootUpperCase(java.lang.String);
Gradle での同様の対処
// build.gradle
dependencies {
implementation("com.example:legacy-lib:1.0") {
exclude group: "org.apache.commons", module: "commons-lang3"
}
implementation "org.apache.commons:commons-lang3:3.12.0" // 明示
}
// 全体で固定
configurations.all {
resolutionStrategy {
force "org.apache.commons:commons-lang3:3.12.0"
}
}
// 依存ツリー表示
// gradle dependencies
類似エラーとの違い
| エラー | 原因 |
|---|---|
NoSuchMethodError | クラスはあるがメソッドがない (このページ) |
NoClassDefFoundError | クラスファイルそのものがない(実行時) |
ClassNotFoundException | Class.forName 等で動的読込失敗 |
AbstractMethodError | 抽象メソッドの未実装 |
IncompatibleClassChangeError | 互換性のないクラス変更 |
UnsupportedClassVersionError | Java バージョン不整合 |
調査の流れ
- エラーメッセージから対象クラス・メソッドを特定
mvn dependency:tree | grep ...で関係する依存を抽出- 同じ groupId/artifactId で複数バージョンが無いか確認
- exclusion または dependencyManagement でバージョン統一
- jar の中身を
javapで確認 - クリーンビルド:
mvn clean package
関連記事
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- java.lang.NoSuchMethodError
- java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
- java.lang.UnsupportedClassVersionError
- version less than X.X is not supported.
- パッケージ~は存在しません
- org.apache.jasper.JasperException: ...The jsp:param action must not be...
- java.io.FileNotFoundException: ファイル名 (許可がありません)
- java.sql.SQLException: Cannot convert value 'YYYY-MM-DD ...' from column n(YYYY-MM-DD ...) to TIMESTAMP.
- 警告: この文字は、エンコーディング[文字コード]にマップできません
- java.text.ParseException: Unparseable date
- Unsupported major.minor version 52.0
- エンティティ" ... "への参照は';'デリミタで終了する必要があります。
- java.math.BigDecimal cannot be cast to java.lang.String
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- APIキー取得方法 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?