この記事は公式アカウント[DevelopingPigeon]から公開されています!フォローへようこそ!!!
古いルール-姉妹都市都市:
1。バグの説明
以下に示すように、本質はNoSuchMethodErrorです。
java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)V
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:394)
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:383)
at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:249)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:225)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
at com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication.main(DemoNoSuchMethodErrorApplication.java:13)
この例外は、AnnotationAwareOrderComparatorクラスにsort(Ljava / util / List;)V関数がなく、次の関数がJVMの関数表現を使用していることを意味します。
二。ソリューション
(I.概要
特定のパッケージの特定のクラスに特定の機能がないため、問題ではないようです。特定のパッケージのバージョンが原因で、このパッケージのこのクラスにこの機能がないか、またはその可能性があります。このパッケージの優先度は同じ名前の他のパッケージよりも高く、他のパッケージが上書きされるため、このパッケージの場所を見つける必要があります。
(2つ)arthasツール
では、このクラスがどのパッケージからインポートされているかをどのように見つけますか?アリババのオープンソースarthasツールを使用して問題を解決すると、次の問題を解決できます。
1.このクラスはどのjarパッケージからロードされますか?さまざまな種類の関連する例外が報告されるのはなぜですか?
2.変更したコードが実行されないのはなぜですか?コミットしなかったのでしょうか?間違ったブランチ?
3.問題が発生した場合、オンラインでデバッグできません。ログを追加することによってのみ再公開できますか?
4.特定のユーザーのオンラインでのデータ処理に問題がありますが、オンラインでデバッグできず、オフラインで再現できません。
5.システムの稼働状況を表示するためのグローバルな視点はありますか?
6. JVMのリアルタイムの実行ステータスを監視する方法はありますか?
このツールを使用して、このクラスがどのパッケージからインポートされているかを確認しますが、まず、ツールの使用時に異常なクラスがまだ実行されているプロセスを確認する必要があります。これには、コードブロックでtry-を使用する必要があります。異常。catchステートメントブロックを使用して例外をキャッチします。ここでは、例外クラスオブジェクトの代わりにThrowableクラスオブジェクトを使用してキャッチします。Exceptionクラスを使用すると、エラーがエラーであるため、キャッチできない可能性があります。エラーなので、エラーを直接報告して終了します。また、ThrowableクラスはErrorクラスとExceptionクラスの親クラスです。Errorクラスが含まれているため、このエラーをキャッチできます。キャッチコードブロックを入力してください。 、blockingステートメントを実行し、プロセスの実行を継続して、arthasツールがプロセスの実行中にそれを検出できるようにします。エラーが発生しました。
arthasのjarパッケージをダウンロードした後、新しいフォルダーを作成し、その中にjarパッケージを配置します。その後、IDEAのコンソールまたはCMDで使用できます。フォルダを入力して、
java -jar arthas-boot.jar
arthasはJVMによって開始されたプロセスをスキャンします。対応するプロセスを選択し、プロセスを入力し、scコマンドを実行してクエリを実行できます。
sc -d org.springframework.core.annotation.AnnotationAwareOrderComparator
以下に示すような出力が表示され、spring-2.5.6jarパッケージが見つかりました。
$ sc -d org.springframework.core.annotation.AnnotationAwareOrderComparator
class-info org.springframework.core.annotation.AnnotationAwareOrderComparator
code-source /Users/hengyunabc/.m2/repository/org/springframework/spring/2.5.6.SEC03/spring-2.5.6.SEC03.jar
name org.springframework.core.annotation.AnnotationAwareOrderComparator
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name AnnotationAwareOrderComparator
modifier public
annotation
interfaces
super-class +-org.springframework.core.OrderComparator
+-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@5c647e05
+-sun.misc.Launcher$ExtClassLoader@689e3d07
classLoaderHash 5c647e05
Affect(row-cnt:1) cost in 41 ms.
jadコマンドを使用して、逆コンパイルされたAnnotationAwareOrderComparatorソースコードを表示します。
$ jad org.springframework.core.annotation.AnnotationAwareOrderComparator
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@5c647e05
+-sun.misc.Launcher$ExtClassLoader@689e3d07
Location:
/Users/hengyunabc/.m2/repository/org/springframework/spring/2.5.6.SEC03/spring-2.5.6.SEC03.jar
/*
* Decompiled with CFR 0_132.
*/
package org.springframework.core.annotation;
import java.lang.annotation.Annotation;
import org.springframework.core.OrderComparator;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
public class AnnotationAwareOrderComparator
extends OrderComparator {
protected int getOrder(Object obj) {
Order order;
if (obj instanceof Ordered) {
return ((Ordered)obj).getOrder();
}
if (obj != null && (order = obj.getClass().getAnnotation(Order.class)) != null) {
return order.value();
}
return Integer.MAX_VALUE;
}
}
Affect(row-cnt:1) cost in 286 ms.
jarパッケージが除外されている限り、実際にはソート機能がないことがわかり、最終的に問題が見つかりました。
(3)mavenコマンド
スプリングジャーパッケージを見つける方法は?まず、Mavenコマンドから始めて、Mavenの依存関係ツリーを表示します。依存関係の競合はありません。CTRL+ Fを使用してjarパッケージを検索できます。また、mavenコマンドを直接使用して、Springパッケージの依存関係ツリーを検索するなど、指定したパッケージの依存関係ツリーを検索することもできます。
mvn dependency:tree -Dincludes=org/springframework/spring
これは非常に面倒です。次に、ファイル->設定->プラグイン-> mavenヘルパーを直接検索し、mavenプラグインmaven-helperを見つけて、インストールをクリックし、IDEAを再起動します。
Maven Helperが成功すると、左下隅に追加のタブページDependency Analyzerが表示され、次の操作を実行できます。
1.競合(競合の表示)
2.すべての依存関係をリストとして表示(すべての依存関係をリスト形式で表示)
3.ツリーとしてのすべての依存関係(ツリー形式ですべての依存関係を表示)
したがって、スプリングパッケージの場所が新しく追加されたパッケージで見つかった場合は、パッケージの座標インポートで次のメソッドを直接使用して、スプリングの依存関係を除外します。
<!-- Canal客户端-->
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.0.24</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
この時点で、問題は解決しました。!!