classがあるのになぜClassNotFoundExceptionに報告するのですか?
1868 ワード
説明
, 。 , jar , pom , java -jar jar ,
Exception in thread "main" java.lang.NoClassDefFoundError
...
Caused by: java.lang.ClassNotFoundException: ...
ぶんせき
libパッケージの下にこのインタフェースが依存するjarパッケージがあります
ここまで読んで下を見ないで、どうして新聞に類が見つからないのか考えてみましょう.
パッケージ時にMANIFESTが同時に生成する.MFファイル、jarパッケージの基本情報を記述
Main-Classはプログラムの入り口を指定して、java-jar*を使うことができます.jarを起動する
Class-Pathはjarパケット依存関係を指定し、クラスローダはこのパスに基づいてclassをロードします.
はい、MANIFESTについて知りました.MFファイル、それでは私达はこのファイルを见て、ある読者はまだどのようにこのファイルを探して、あなたのプログラムのjarを解凍すればいいことを知らないかもしれません、unzip*.jarが見えます
Class-Pathでエラーが報告されているクラスを見て、私が赤い枠で囲まれたjarパッケージの中で、このjarパッケージの名前は私たちのlibパッケージの対応するjarの名前とは違います.
libパッケージの中はdspadinfoです.client-0.0.41-SNAPSHOT.jar
MANIFESTではMFファイル中はdspadinfoである.client-0.0.41-20190902.070402-1.jarは、タイムスタンプ付きの形式で、Snapshot Versionというスナップショットバージョンのjarをパッケージ化する際に唯一のバージョンを使用したことを説明しています.これはデフォルトで、名前が合わないので、対応するクラスにロードできず、上のエラーを報告しました.
解決する
mavenの公式ドキュメントには、スナップショットバージョンの処理について説明されています.http://maven.apache.org/share...
「-SNAPSHOT」のバージョン名を強制的に使うには、無効にするだけでいいです.
false
皆さんに私のプロジェクトの中の配置をあげて、参考にします
org.apache.maven.plugins
maven-jar-plugin
true
lib/
*.dsp.redispositive.Application
false
pomファイルの修正後、再パッケージ配置後、MANIFEST.MFファイルのClass-Pathのjarパッケージがdspadinfoです.client-0.0.41-SNAPSHOT.jar実行は問題ありません
似たような問題があったら、この解決策を考えてほしい.