java.lang.noclassdeffounderrorコマンドライン
-
11-10-2019 - |
質問
私はEclipseでアプリケーションを開発していますが、Eclipse内から正常に動作しています。私が抱えている問題は、JARファイルにエクスポートしてコマンドラインから実行すると、javax.mail.internetのnoclassdeffoundエラーが表示されることです。
私のプロジェクトビルドパスとクラスパスの両方で、activation.jarとmail.jarライブラリをjavax.mail.internetを使用するために必要なライブラリを含めました。瓶。私のビルドパスにそれらのファイルがある場合、クラスパスもそうである場合、なぜこれが機能しないのでしょうか?
これがエラースタックです:Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/mai
l/internet/InternetAddress
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.mail.internet.InternetAddress
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 27 more
解決
うわー、私は完全な馬鹿のように感じます。あなたがしなければならないのは、eclipseで「jarファイル」を選択する代わりにjarファイルにエクスポートするとき、「実行可能なjarファイル」を選択し、それを小さく保つために必要なライブラリをパッケージ化するように指示することです。 。
別のオプションは、JARが作成されているときにマニフェストファイルにこの行を追加することです。Class-Path: lib/mail.jar
そして、エクスポートされたJARが入るのと同じフォルダー内にメールを含むLIBフォルダーを使用してください。ブーム。
私の意見では、前者のオプションは最高です。
他のヒント
これはほぼ間違いなくクラスパスの問題です。エクスポートしたjarを開いてみてください(Winzip経由で、または.Zipに名前を変更してWindowsを使用してください)。JARREDフォルダー構造を調べて、「Javax/Mail/Internet/」が存在し、InternetAdDress.Classファイルが含まれていると判断します。または、jar内にあるmanifest.mfを開き、クラスパスエントリが含まれており、マニフェストで指定されたJARがマニフェストで指定された場所に存在することを判断します。
編集:JVMのシステムプロパティから印刷して、ランタイムクラスパスを調べます。
System.out.println(System.getProperty("java.class.path"));
あなたはそれが欠けていると思うと思います、あなたが手動検査の余分な作業を経験させて申し訳ありませんが、それは時々明らかにされています。
通常、JARファイルはJAR内に含まれていません。実行可能ジャーをエクスポートするには、2つの一般的な方法があります。
- クラスファイルをJARし、JVMがあなた自身と比較して他のライブラリを見つけることができるClassPathを指定するマニフェストを含めます。
- JARクラスは、他の瓶の内容とともに単一の瓶にファイルします。これはおそらくあなたが望むものであり、Eclipseの「エクスポート...> Runnable Jarファイル」ウィザードを使用して達成することができます。 「実行可能なJARファイル」を使用して、正しい実行構成を選択してください。
あなたはこれを見つけるかもしれないので、質問に関連する:瓶内の瓶を含むクラスパス
1つの可能性は、Javax.mailパッケージが依存しているクラス(別名推移的依存関係)が欠落していることです。しかし、私は最初にClassPathを再確認します。 Javaコマンドライン実行可能ファイルは、欠落しているディレクトリ(または既存の紹介されていない瓶)をまったく示していません。私は時々セミコロンとコロンをパスセパレーターと混同しているため、クラスが見つかりません。
JDK 1.6がついに持っていた1つの良いことは、ワイルドカードを定義する能力でした。
java -cp lib/\*
(バックスラッシュはアスタリスクを引用するために使用されるため、Unixシェルはそれを拡張しません)
これには、ディレクトリ「lib/」からのすべてのjarが含まれます。そのため、そのディレクトリにすべての個々の瓶を手動で追加する必要がないように。
classpathにmail.jarを追加し、開始ディレクトリがlibの親であることを確認してください(後者は最も可能性の高い問題のようです)。次のように、主な方法を開始できます。
System.getProperties().store(System.out, "boot props");