命令行中的java.lang.NoClassDefFoundError

命令行中的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时则不行。如果我的构建路径中有这些文件,那么我的类路径中也有这些文件,那么这为什么不起

我正在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(未知源)
... 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有两种常见方法:

  • Jar类文件,并包含一个清单,该清单指定JVM可以在其中找到相对于您自己的库的其他库的类路径
  • 将您的类文件和其他Jar的内容放入一个Jar中。这很可能是您想要的,并且可以通过使用eclipse的“导出…>Runnable 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