簡體   English   中英

命令行中的java.lang.NoClassDefFoundError

[英]java.lang.NoClassDefFoundError in command line

我正在Eclipse中開發應用程序,並且可以在Eclipse中正常運行。 我遇到的問題是,當我將其導出到jar文件並從命令行運行它時,出現javax.mail.internet的NoClassDefFound錯誤。

在我的項目構建路徑和類路徑中,我都包含了使用javax.mail.internet所需的activation.jar和mail.jar庫,就像我說的那樣,它在Eclipse中可以正常工作,但是當我將其導出到a罐。 如果我的構建路徑包含這些文件,我的類路徑也包含這些文件,為什么這不起作用?

這是錯誤堆棧: 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 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

哇,我感覺像個白痴。 您要做的就是在導出為jar文件時,而不是在Eclipse中選擇“ JAR File”,然后選擇“ Runnable JAR File”,然后告訴它將所需的庫打包以使其更小且更安全,一切正常。

另一種選擇是在創建jar時在清單文件中添加以下行: Class-Path: lib/mail.jar

然后,在導出的jar所在的同一文件夾中,只有一個帶mail.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中。 有兩種常見的導出可執行jar的方法:

  1. 將您的類文件打包,並包含一個清單,該清單指定JVM可以在其中找到相對於您自己的其他庫的類路徑。
  2. 將您的類文件和其他jar的內容一起打包到一個jar中。 這很可能是您想要的,並且可以通過使用eclipse的“導出...>可運行的JAR文件”向導來完成。 確保使用“可運行的JAR文件”並選擇正確的運行配置。

您可能會發現以下相關問題: JAR中的類路徑(包括JAR)

一種可能是缺少javax.mail軟件包所依賴的類(又稱為傳遞依賴項)。 但是我首先要仔細檢查類路徑; java命令行可執行文件根本不表示缺少目錄(或不存在的引用jar)-有時我將分號和冒號混在一起作為路徑分隔符,這導致找不到類。

JDK 1.6最終具有的一項好處是能夠定義通配符,因此您可以執行以下操作:

  java -cp lib/\*

(反斜杠用於引用星號,因此unix shell不會對其進行擴展)

其中包括目錄“ lib /”中的所有jar; 因此您不必手動在該目錄中添加所有單獨的jar。

將mail.jar添加到您的類路徑中,並確保您的起始目錄是lib的父目錄(后者似乎是最可能的問題)。 您可以使用以下方法啟動您的主要方法:

System.getProperties().store(System.out, "boot props");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM