JavaFX打包可执行Jar后遇NoClassDefFoundError: jakarta/mail/internet/AddressException
JavaFX打包可执行Jar后缺失Jakarta Mail类的问题
我在JavaFX应用中集成Jakarta Mail实现邮件发送功能,IDE内测试完全正常,能成功发送邮件,但打包成可执行Jar后运行抛出NoClassDefFoundError,注释邮件相关代码后Jar可正常运行。
错误堆栈
Caused by: java.lang.NoClassDefFoundError: jakarta/mail/internet/AddressException at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3429) at java.base/java.lang.Class.getConstructor0(Class.java:3634) at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2810) at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:939) at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:981) at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:230) at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:755) at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2845) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2641) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2555) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2523) at com.Sapplication.Controllers.DashControllerAdmin.initPanes(DashControllerAdmin.java:114) at com.Sapplication.Controllers.DashControllerAdmin.initialize(DashControllerAdmin.java:77) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2662) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2555) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2523) at com.Sapplication.StageControllers.CreateStage.createStage(CreateStage.java:23) at com.Sapplication.Controllers.LoginController.btnSignIn(LoginController.java:203) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ... 36 more Caused by: java.lang.ClassNotFoundException: jakarta.mail.internet.AddressException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 56 more
邮件发送相关代码
Authenticator authenticator = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(USERNAME, PASSWORD); } }; Session session = Session.getInstance(PROPERTIES, authenticator); session.setDebug(debug); try { // 创建带头部信息的邮件 MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); InternetAddress[] address = {new InternetAddress(to)}; msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject(subject); msg.setSentDate(new Date()); // 创建邮件正文 Multipart mp = new MimeMultipart(); for (String message : messages) { MimeBodyPart mbp = new MimeBodyPart(); mbp.setText(message, "us-ascii"); mp.addBodyPart(mbp); } msg.setContent(mp); // 发送邮件 Transport.send(msg); JOptionPane.showMessageDialog(null,"Email Sent Successfully!"); } catch (AddressException e) { throw new RuntimeException(e); } catch (MessagingException e) { throw new RuntimeException(e); }
已尝试的解决方案
- 在POM中添加Jakarta Mail和Jakarta Activation依赖:
<dependency> <groupId>com.sun.activation</groupId> <artifactId>jakarta.activation</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>2.0.1</version> </dependency>
- 确认项目结构的Libraries和Modules中已包含上述两个依赖,也尝试过删除Maven依赖直接添加本地Jar,均无效
- 在VM选项中添加以下配置:
--module-path "C:\Program Files\Java\javafx-sdk-19.0.2.1\lib" --add-modules javafx.controls,javafx.fxml,jakarta.activation,jakarta.mail --add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED
环境信息
- IDE:IntelliJ
- SDK:OpenJDK 19.0.2
- 打包方式:通过IntelliJ的Build -> Build Artifacts生成out文件夹中的可执行Jar,后续使用jdeploy管理更新
运行Jar的CMD命令
java -jar "C:\Users\Main PC\Desktop\SApplication.jar"
内容的提问来源于stack exchange,提问作者Hiimisabella
相关产品推荐
相关产品推荐

