当前位置: 首页 > 知识库问答 >
问题:

异常:java.lang.NoClassDefFoundError: javax/激活/DataHandler

东门理
2023-03-14

我在javafx中创建了一个聊天应用程序,并尝试使用javamail api来验证用户的电子邮件。问题是,当我运行应用程序时,它向我显示以下消息:Java . lang . noclassdeffounderror:javax/activation/data handler我使用的是java 17、javafx 17、netbeans ide 12.0。

这是我写的代码:

package chat;

import java.util.Properties;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Chat extends Application{
   private Parent raiz;
   private Scene scene;
   private Stage stg1;
   private Image imagenx;

   @Override
   public void start(Stage stage) throws Exception {
      raiz = FXMLLoader.load(getClass().getResource("Chat.fxml"));
      scene = new Scene(raiz);
      scene.setUserAgentStylesheet(getClass().getResource("chat.css").toExternalForm());
      stg1 = stage;
      stg1.setScene(scene);
      imagenx = new Image(getClass().getResource("icono.jpg").toString());
      stg1.getIcons().add(imagenx);
      stg1.setTitle("Video chat");
      stg1.setWidth(800);
      stg1.setHeight(600);
      stg1.show();
   }

   private void enviarMail(String destinatario){
      String remitente = "mi remitente";
      String asunto = "enviar correo de confirmacion";
      String cuerpo = "mensaje a enviar";
      String clv = "1234";
    
      Properties props = System.getProperties();
      props.put("mail.smtp.host", "smtp.gmail.com");
      props.put("mail.smtp.user", remitente);
      props.put("mail.smtp.clave", clv);
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.port", "587");
    
      Autenticador aut = new Autenticador(remitente,clv);
      sesion = Session.getInstance(props,aut);
      mm = new MimeMessage(sesion);

      try{
        mm.setFrom(new InternetAddress(remitente));
        mm.addRecipients(Message.RecipientType.TO, destinatario);
        mm.setSubject(asunto);
        mm.setText(cuerpo);
        try(Transport transport = sesion.getTransport("smtp")) {
            transport.connect("smtp.gmail.com", remitente, clv);
            try{
                transport.sendMessage(mm, mm.getAllRecipients());
            }
            catch(MessagingException ex){
                System.out.println(ex);
            }
        }
        catch(Exception ex){
            System.out.println(ex);
        }
      }
      catch(MessagingException ex){
        System.out.println(ex);
      }
   }

   public static void main(String[] args) {
      launch(args);
      enviarMail("example1@gmail.com");
   }
}

class Autenticador extends Authenticator{
   private String smtp_usuario = "";
   private String smtp_pass = "";

   Autenticador() {}

   Autenticador(String user , String pass) {
     this.smtp_usuario = user;
     this.smtp_pass = pass;
   }

   @Override
   public PasswordAuthentication getPasswordAuthentication() {
     return new PasswordAuthentication(this.smtp_usuario, 
     this.smtp_pass);
   }
}

该错误在这行代码中生成:mm = new mime message(sesion);

将库从javax.mail更改为jakarta.mail,将netbean更新为12.6版,我安装了java 17版,添加jarjakarta.activation,但当我在netbean中运行项目时,会生成此错误:java.lang.NoClassDefFoundError: jakarta/激活/DataHandler。谷歌搜索我发现我应该添加以下依赖项:

<dependency>
  <groupId>jakarta.activation</groupId>
  <artifactId>jakarta.activation-api</artifactId>
  <version>2.0.1</version>
</dependency>

查询,应该在哪里添加带有依赖关系的pom.xml文件,如何使用jakarta.activation jar?我是自学的,所以这个问题可能很明显。除了JavaMail,我还能使用其他库来发送电子邮件吗?

共有1个答案

扶绍辉
2023-03-14

包括雅加达激活库

雅加达邮政是Java邮件的现代包装。

参见雅加达邮报自述:

Jakarta Mail需要Jakarta Activation 2.0.0或更高版本。

雅加达激活网站和下载。

如果您使用构建工具(强烈推荐),例如 Maven 或 Gradle,则当您添加 Jakarta 邮件依赖项时,它可能已经将 Jakarta 激活的传递依赖项添加到您的构建中。如果没有,请自行添加依赖项。

如果您还有其他问题

使用所有软件的最新版本,JDK/JavaFX 17.0.2,JakartaMail 2.0.1。参见:

  • 雅加达邮件发布下载。

另请参阅雅加达邮件兼容性说明

在此版本中,该模块的名称更改为“jakarta.mail”。

所以在你的module-info. Java中使用jakarta.mail当需要模块时

运筹学

放置雅加达。如果通过命令行开关而不是通过模块信息.java添加模块,请在--添加模块开关中发送邮件

示例应用程序

以下应用程序编译并运行,但由于身份验证不正确而尝试发送邮件时会失败,但是,我认为它演示了如何修复问题中提出的类解析问题。

它的作用:

>

  • 需要模块信息中的jakarta.mail

    在pom.xml中添加对jakarta邮件的依赖。

    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>jakarta.mail</artifactId>
        <version>2.0.1</version>
    </dependency>
    

    不需要对 jakarta 激活框架库的显式依赖,因为它是通过对 jakarta.mail 的可传递依赖来实现的。

    将导入更改为使用 jakarta.mail 包而不是 java.mail 包。

    对问题中的示例进行细微更改,以允许其编译和运行。

    信息.java模块

    module com.example.maildemo {
        requires javafx.controls;
        requires jakarta.mail;
    
        exports com.example.maildemo;
    }
    

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.example</groupId>
        <artifactId>mail-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <name>mail-demo</name>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <junit.version>5.7.1</junit.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-controls</artifactId>
                <version>17.0.2</version>
            </dependency>
            <dependency>
                <groupId>com.sun.mail</groupId>
                <artifactId>jakarta.mail</artifactId>
                <version>2.0.1</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>17</source>
                        <target>17</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    邮件演示应用程序.java

    package com.example.maildemo;
    
    import jakarta.mail.*;
    import jakarta.mail.internet.InternetAddress;
    import jakarta.mail.internet.MimeMessage;
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.stage.Stage;
    
    import java.util.Properties;
    
    public class MailDemoApp extends Application {
    
        @Override
        public void start(Stage stage) {
            Button sendMailButton = new Button("Send mail");
            sendMailButton.setOnAction(e -> enviarMail("example1@gmail.com"));
            stage.setScene(new Scene(sendMailButton));
            stage.show();
        }
    
        private void enviarMail(String destinatario) {
            String remitente = "127.0.0.1";
            String asunto = "enviar correo de confirmacion";
            String cuerpo = "mensaje a enviar";
            String clv = "1234";
    
            Properties props = System.getProperties();
            props.put("mail.smtp.host", "smtp.gmail.com");
            props.put("mail.smtp.user", remitente);
            props.put("mail.smtp.clave", clv);
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.port", "587");
    
            MyAuthenticator aut = new MyAuthenticator(remitente, clv);
            Session session = Session.getInstance(props, aut);
            MimeMessage mm = new MimeMessage(session);
    
            try {
                mm.setFrom(new InternetAddress(remitente));
                mm.addRecipients(Message.RecipientType.TO, destinatario);
                mm.setSubject(asunto);
                mm.setText(cuerpo);
    
                try (Transport transport = session.getTransport("smtp")) {
                    transport.connect("smtp.gmail.com", remitente, clv);
                    transport.sendMessage(mm, mm.getAllRecipients());
                }
            } catch (MessagingException ex) {
                ex.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    
    class MyAuthenticator extends Authenticator {
        private String smtp_usuario = "";
        private String smtp_pass = "";
    
        MyAuthenticator(String user, String pass) {
            this.smtp_usuario = user;
            this.smtp_pass = pass;
        }
    
        @Override
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(this.smtp_usuario,
                    this.smtp_pass);
        }
    }
    

    Maven 依赖树

    [INFO] --- maven-dependency-plugin:3.2.0:tree (default-cli) @ mail-demo ---
    [INFO] com.example:mail-demo:jar:1.0-SNAPSHOT
    [INFO] +- org.openjfx:javafx-controls:jar:17.0.2:compile
    [INFO] |  +- org.openjfx:javafx-controls:jar:win:17.0.2:compile
    [INFO] |  \- org.openjfx:javafx-graphics:jar:17.0.2:compile
    [INFO] |     +- org.openjfx:javafx-graphics:jar:win:17.0.2:compile
    [INFO] |     \- org.openjfx:javafx-base:jar:17.0.2:compile
    [INFO] |        \- org.openjfx:javafx-base:jar:win:17.0.2:compile
    [INFO] \- com.sun.mail:jakarta.mail:jar:2.0.1:compile
    [INFO]    \- com.sun.activation:jakarta.activation:jar:2.0.1:compile
    

  •  类似资料:
    • 我正在编写一个python脚本,该脚本发送到网络中的每台交换机,并发出一个copy running-config TFTP命令,备份交换机的运行配置。我在windows上使用Python2.7中的paramiko库。 脚本本身非常简单,它所做的只是创建一个名为“备份”的目录(如果还不存在的话),以及另一个名为“今天的日期”的目录,然后将该目录用于TFTP。并启动TFTP服务器。然后它只需通过SSH

    • 当实例的试用期结束时,Navicat Monitor 需要令牌以继续监控该实例。令牌可以作为永久许可证或订阅购买。若要管理你的令牌并许可你的实例,请前往“配置”->“激活令牌密钥和许可实例”。 【注意】永久许可证和订阅方案不能在同一个 Navicat Monitor 上使用。在更改激活方法之前,你需要取消激活令牌密钥或退出你的 Navicat ID。 永久许可证 如果你购买了永久许可证,你将收到一

    • 我试图使我的wordpress网站翻译准备好,使用'poedit'。我激活翻译有问题。我想只翻译网站,而不是wordpress系统。我有我的. pot,. po和. mo文件在'语言'文件夹在我的主题目录,我有这个代码在我的functions.php文件: 那么,在poedit程序中保存并翻译所有内容后,如何在我的站点中激活它?我现在正在使用本地主机。

    • 行动时刻 - 激活NULL领域 请按照以下步骤激活NULL域: 编辑FreeRADIUS配置目录下的proxy.conf文件,并更改以下部分: #realm NULL { # authhost = radius.company.com:1600 # accthost = radius.company.com:1601 # secret = testing123 #} 更改为: realm NUL

    • 激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。 Sigmoid 也成为 S 形函数,取值范围为 (0,1)。Sigmoid 将一个实数映射到 (0,1) 的区间,可以用来做二分类。Sigmoid 在特征相差比较复杂或是相差不是特别大时效果比较好。 sigmoid 缺点: 激活函数计算量大(指数运算),反向传播求误差梯度时,求导

    • 问题内容: 我编写了一个小的hibernate应用程序,并获得以下stacktrace: 我不明白这个错误的原因。 码: 我的pom.xml: 我已经阅读了相关主题,但是我真的不知道如何解决它-我不想推出Hibernate 4.0版本。 如何解决? 问题答案: Hibernate Validator 5x与validation-api 1.0.x不兼容 JPA 2.0:在JPA2.0中使用java