首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >例外: java.lang.NoClassDefFoundError: javax/activation/DataHandler

例外: java.lang.NoClassDefFoundError: javax/activation/DataHandler
EN

Stack Overflow用户
提问于 2022-03-01 18:55:27
回答 1查看 2.2K关注 0票数 1

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

这是我写的代码:

代码语言:javascript
复制
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 =新的MimeMessage(sesion);

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

代码语言:javascript
复制
<dependency>
  <groupId>jakarta.activation</groupId>
  <artifactId>jakarta.activation-api</artifactId>
  <version>2.0.1</version>
</dependency>

查询,我应该在哪里添加带有依赖项的pom.xml文件,以及如何使用jakarta.activation jar?我是自学成才的,所以问题可能是来自JavaMail的非常JavaMail,还有其他图书馆可以用来发送电子邮件吗?

EN

回答 1

Stack Overflow用户

发布于 2022-03-02 00:11:35

包括雅加达激活库

Jakarta是Java邮件的现代包装。

雅加达邮件自述

雅加达邮件需要JakartaActivation2.0.0或更高版本。

雅加达活化网站下载.

如果您使用一个构建工具(强烈推荐),例如Maven或Gradle,当您添加Jakarta依赖项时,它可能已经向您的构建中添加了一个传递依赖关系雅加达激活。如果没有,那么自己添加依赖项。

如果你有其他问题

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

此外,请参见雅加达邮件兼容性说明

在这个版本中,该模块的名称被更改为"jakarta.mail“。

因此,当需要模块时,在您的jakarta.mail中使用module-info.Java

如果通过命令行开关而不是jakarta.mail添加模块,则将--add-module放在--add-module交换机中。

示例应用程序

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

它所做的事情:

  1. 模块中的requires jakarta.mail -info。
  2. 在pom.xml中添加对雅加达邮件的依赖。 com.sun.mail jakarta.mail 2.0.1
  3. 不需要显式依赖雅加达激活框架库,因为它是通过对jakarta.mail的传递依赖来实现的。
  4. 将导入更改为使用jakarta.mail包而不是java.mail包。
  5. 对问题中的示例进行小的更改,以使其能够编译和运行。

module-info.java

代码语言:javascript
复制
module com.example.maildemo {
    requires javafx.controls;
    requires jakarta.mail;

    exports com.example.maildemo;
}

pom.xml

代码语言:javascript
复制
<?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>

MailDemoApp.java

代码语言:javascript
复制
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依赖树

代码语言:javascript
复制
[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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71313332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档