命令行中的 java.lang.NoClassDefFoundError

标签 java eclipse jar jakarta-mail

我正在 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(未知酸 ce) 在 java.awt.Component.processMouseEvent(未知来源) 在 javax.swing.JComponent.processMouseEvent(未知来源) 在 java.awt.Component.processEvent(未知来源) 在 java.awt.Container.processEvent(未知来源) 在 java.awt.Component.dispatchEventImpl(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.LightweightDispatcher.retargetMouseEvent(未知来源) 在 java.awt.LightweightDispatcher.processMouseEvent(未知来源) 在 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( native 方法) 在 java.net.URLClassLoader.findClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 sun.misc.Launcher$AppClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) ... 还有 27 个

最佳答案

这几乎可以肯定是类路径问题。尝试打开您导出的 JAR(通过 winzip,或重命名为 .zip 并使用 windows)并检查 jarred 文件夹结构以确定“javax/mail/internet/”存在并且其中包含 InternetAddress.class 文件。或者打开位于 JAR 中的 MANIFEST.MF 以确定它包含类路径条目并且 list 中指定的 jar 存在于 list 指定的位置。

编辑: 通过从 JVM 中的系统属性打印它来检查您的运行时类路径。

System.out.println(System.getProperty("java.class.path"));

我想你会发现它不见了,很抱歉让你经历了额外的人工检查工作,但它有时会揭示问题。

通常 jar 文件不包含在 jar 中。导出可执行 jar 有两种常见的方法:

  1. 将您的类文件打包并包含一个 list ,该 list 指定 JVM 可以在其中找到与您自己的库相关的其他库的类路径。
  2. 将您的类文件与其他 jar 的内容一起打包到一个 jar 中。这很可能是您想要的,并且可以通过使用 eclipse 的“导出...> 可运行 JAR 文件”向导来完成。请务必使用“可运行 JAR 文件”并选择正确的运行配置。

您可能会发现这个 SO 问题相关: Classpath including JAR within a JAR

关于命令行中的 java.lang.NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4686695/

相关文章:

从 jar 中删除文件的 ant 任务

java - 如何将 JAR 文件作为 Java 程序运行,特别是 http ://iapg. jade-hs.de/personen/brinkhoff/generator/

java - 如何在eclipse中从Maven项目创建Jar文件

java - 以普通用户身份安装 Install4j 时出现 NotSerializableException

Java - 继续对整数添加值

java - 将curl命令翻译成java/android

eclipse - 如何在 Eclipse 中显示 Project Explorer 窗口?

java - ConcurrentHashMap 更改对所有线程可见?

java - 如何制作资源加载器?

java - 无法加载 JNI 共享库 (JDK)