2011-01-13 23 views
1

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

在我的项目构建路径和类路径中,我都包含了使用javax.mail.internet所需的activation.jar和mail.jar库,并且像我说的那样,它可以在Eclipse中正常工作,但当我将它导出到jar。如果我的构建路径有这些文件,我的班级路径为什么这不起作用?

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

+0

是`... javax/mai l/internet中的空间...`复制/粘贴或输出交错问题? – 2011-01-14 00:55:38

+0

是的复制/粘贴问题。 – Graham 2011-01-14 01:14:57

回答

2

哇,我觉得自己像个白痴。所有你需要做的是当导出到一个jar文件而不是在Eclipse中选择“JAR文件”时,选择“Runnable JAR File”,然后告诉它打包所需的库以保持它的小和wa-la,一切都很好。

另一个选项是在清单文件中加入这一行被创建时的jar: Class-Path: lib/mail.jar

然后就是有一个了mail.jar lib文件夹在它的文件夹内导出的罐子会进来。兴旺。

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

0

一种可能性将是东西,即javax.mail包类依赖于(又名传递依赖)失踪了。但我会首先仔细检查classpath; java命令行可执行文件根本不指示丢失的目录(或不存在的引用jar) - 我有时会混合使用分号和冒号作为路径分隔符,并且这会导致找不到类。

一个好处JDK 1.6终于是定义通配符的能力,这样你可以这样做:

java -cp lib/\* 

(用于报价星号这样的UNIX shell不会展开反斜杠)

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

+0

这绝对是在我的类路径中,这里是条目:\t``classpathentry kind =“lib”path =“lib/activation.jar”/> \t ` – Graham 2011-01-14 00:08:57

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”向导来完成。一定要使用“可运行JAR文件”并选择正确的运行配置。

您可能会发现这太问题有关: Classpath including JAR within a JAR

0

添加了mail.jar到类路径,并确保您的起始目录LIB的父(后者似乎是最有可能的问题)。 你就可以开始你的主要方法W /水木清华这样的:

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