命令行中的java.lang.NoClassDefFoundError
我正在Eclipse中开发一个应用程序,它在Eclipse中运行良好。我遇到的问题是,当我将它导出到jar文件并从命令行运行它时,javax.mail.internet会出现NoClassDefFound错误 在我的项目构建路径和类路径中,我都包含了使用javax.mail.internet所需的activation.jar和mail.jar库,正如我所说的,它在Eclipse中运行良好,但在我将其导出到jar时则不行。如果我的构建路径中有这些文件,那么我的类路径中也有这些文件,那么这为什么不起作用呢 以下是错误堆栈: 线程“AWT-EventQueue-0”java.lang.NoClassDefFoundError中的异常:javax/mai l/互联网/互联网地址 在javax.swing.AbstractButton.fireActionPerformed(未知源) 位于javax.swing.AbstractButton$Handler.actionPerformed(未知源) 在javax.swing.DefaultButtonModel.fireActionPerformed(未知源) 位于javax.swing.DefaultButtonModel.setPressed(未知源) 在javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知) (行政长官) 位于java.awt.Component.ProcessMouseeEvent(未知源) 位于javax.swing.JComponent.ProcessMouseeEvent(未知源) 位于java.awt.Component.processEvent(未知源) 位于java.awt.Container.processEvent(未知源) 位于java.awt.Component.dispatchEventImpl(未知源) 位于java.awt.Container.dispatchEventImpl(未知源) 位于java.awt.Component.dispatchEvent(未知源) 位于java.awt.LightweightDispatcher.RetargetMouseeEvent(未知源) 位于java.awt.LightweightDispatcher.ProcessMouseeEvent(未知源) 位于java.awt.LightweightDispatcher.dispatchEvent(未知源) 位于java.awt.Container.dispatchEventImpl(未知源) 位于java.awt.Window.dispatchEventImpl(未知源) 位于java.awt.Component.dispatchEvent(未知源) 位于java.awt.EventQueue.dispatchEvent(未知源) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源) 位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源) 位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源) 位于java.awt.EventDispatchThread.pumpEvents(未知源) 位于java.awt.EventDispatchThread.pumpEvents(未知源) 位于java.awt.EventDispatchThread.run(未知源) 原因:java.lang.ClassNotFoundException:javax.mail.internet.InternetAddress 位于java.net.URLClassLoader$1.run(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.net.URLClassLoader.findClass(未知源) 位于java.lang.ClassLoader.loadClass(未知源) 位于sun.misc.Launcher$AppClassLoader.loadClass(未知源) 位于java.lang.ClassLoader.loadClass(未知源)命令行中的java.lang.NoClassDefFoundError,java,eclipse,jar,jakarta-mail,Java,Eclipse,Jar,Jakarta Mail,我正在Eclipse中开发一个应用程序,它在Eclipse中运行良好。我遇到的问题是,当我将它导出到jar文件并从命令行运行它时,javax.mail.internet会出现NoClassDefFound错误 在我的项目构建路径和类路径中,我都包含了使用javax.mail.internet所需的activation.jar和mail.jar库,正如我所说的,它在Eclipse中运行良好,但在我将其导出到jar时则不行。如果我的构建路径中有这些文件,那么我的类路径中也有这些文件,那么这为什么不起
... 27更多的一种可能是javax.mail包所依赖的类(也称为传递依赖项)丢失了。但我会先仔细检查类路径;java命令行可执行文件根本不指示缺少的目录(或不存在的引用JAR)——我有时会将分号和冒号混合作为路径分隔符,这会导致找不到类 JDK 1.6最终拥有的一个优点是能够定义通配符,这样您就可以:
java -cp lib/\*
(反斜杠用于引用星号,以便unix shell不会展开它)
这将包括目录“lib/”中的所有JAR;这样您就不必手动添加该目录中的所有JAR。这几乎肯定是一个类路径问题。尝试打开导出的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有两种常见方法:
将mail.jar添加到类路径中,并确保起始目录是lib的父目录(后者似乎是最可能的问题)。 您可以使用smth启动主方法,如下所示:
System.getProperties().store(System.out, "boot props");
哇,我觉得自己像个十足的白痴。您所要做的就是在导出到一个jar文件时,而不是在Eclipse中选择“jar文件”,选择“Runnable jar文件”,然后告诉它在其中打包所需的库,以保持它的小型化,一切都很好 另一个选项是在创建jar时在清单文件中添加此行:
类路径:lib/mail.jar
然后在导出的jar所在的同一个文件夹中创建一个lib文件夹,其中包含mail.jar。轰
在我看来,前一个选项是最好的。它肯定在我的类路径中,这里是条目:`不,不是,否则你不会得到这个异常。此库条目用于eclipse编译和执行环境,而不是独立环境。那是w