我正在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
答案 0 :(得分:2)
另一个选择是在创建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有两种常用方法:
您可能会发现此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");