命令行中的java.lang.NoClassDefFoundError

时间:2011-01-13 23:58:32

标签: java eclipse jar javax.mail

我正在Eclipse中开发一个应用程序,它在Eclipse中运行良好。我遇到的问题是,当我将它导出到jar文件并从命令行运行时,我得到javax.mail.internet的NoClassDefFound错误。

在我的项目构建路径和类路径中,我已经包含了使用javax.mail.internet所需的activation.jar和mail.jar库,就像我说它在Eclipse中工作正常但在导出时却没有它到一个罐子里。如果我的构建路径有这些文件,那么我的类路径也是如此?为什么这不起作用?

这是错误堆栈: 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

4 个答案:

答案 0 :(得分:2)

哇我觉得自己像个白痴。您所要做的就是在导出到jar文件而不是在Eclipse中选择“JAR File”时选择“Runnable JAR File”,然后告诉它将所需的库打包在其中以保持它的小巧和一致,一切正常

另一个选择是在创建jar时在清单文件中添加此行: Class-Path: lib/mail.jar

然后在导出的jar所在的文件夹中放入一个包含mail.jar的lib文件夹.Boom。

在我看来,前一种选择是最好的。

答案 1 :(得分:1)

这几乎可以肯定是类路径问题。尝试打开您导出的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的“export ...> Runnable JAR File”向导来完成。请务必使用“Runnable JAR File”并选择正确的运行配置。
  3. 您可能会发现此SO问题相关: Classpath including JAR within a JAR

答案 2 :(得分:0)

一种可能性是缺少javax.mail包所依赖的类(也就是传递依赖)。但我会先仔细检查classpath; java命令行可执行文件根本没有指示丢失的目录(或不存在的引用的jar) - 我有时将分号和冒号混合为路径分隔符,这导致找不到类。

JDK 1.6最终拥有的一个好处是能够定义通配符,这样你就可以做到:

  java -cp lib/\*

(反斜杠用于引用星号,因此unix shell不会扩展它)

包括目录'lib /'中的所有jar;这样您就不必手动添加该目录中的所有单个jar。

答案 3 :(得分:0)

将mail.jar添加到您的类路径中,并确保您的起始目录是lib的父目录(后者似乎是最可能的问题)。 你可以像以下一样开始你的主要方法:

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