构建 jar 文件时出现 NoClassDefFoundError

NoClassDefFoundError when building jar file

当我尝试从我的应用程序构建 jar 文件时,出现以下异常:

Error: Unable to initialize main class de.ff.JavaMailTest.SendEmailTLS
Caused by: java.lang.NoClassDefFoundError: jakarta/mail/MessagingException.

Class 如果我在 IntelliJ 中 运行 它工作正常。这是我的代码:

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 http://maven.apache.org/xsd/maven-   4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>de.ff</groupId>
<artifactId>JavaMailTest</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
    <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-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>de.ff.JavaMailTest.SendEmailTLS</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>
</project>```

SendEmailTSL.java:


    package de.ff.JavaMailTest;

    import jakarta.mail.*;
    import jakarta.mail.internet.InternetAddress;
    import jakarta.mail.internet.MimeMessage;
    import java.util.Properties;

    public class SendEmailTLS {
    public static void main(String[] args) {
        System.setProperty("file.encoding", "UTF-8");
        final String username = args[0];
        final String password = args[1];

        Properties prop = new Properties();
        prop.put("mail.smtp.host", "smtp.web.de");
        prop.put("mail.smtp.port", "587");
        prop.put("mail.smtp.auth", "true");
        prop.put("mail.smtp.starttls.enable", "true");

        Session session = Session.getInstance(prop,
                new jakarta.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setRecipients(
                    Message.RecipientType.TO,
                    InternetAddress.parse(args[2])
            );
            message.setSubject(args[3]);
            message.setText(args[4]);
            Transport.send(message);
            System.out.println("Succes");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

感谢您的帮助!

您需要构建指定 Main-Class 属性的 Jar 文件。

您可以手动或使用程序集插件或使用IntelliJ

  1. 正在手动创建 运行nable jar - https://docs.oracle.com/javase/tutorial/deployment/jar/appman.html
  2. 使用 Assembly 插件创建 运行nable jar - https://maven.apache.org/plugins/maven-assembly-plugin/usage.html
  3. 使用以下步骤使用 IntelliJ 创建 运行nable jar

以下是使用 IntellIj 执行此操作的步骤 -

  1. 打开项目结构对话框(文件 -> 项目结构)

  1. Select 项目设置中的工件选项

  1. 点击+按钮添加Jar神器和selectFrom modules with dependencies

  1. Select 您在 Create JAR from modules dialog 中的主要 class 然后单击确定

  1. 点击确定保存您的配置

  1. 单击 Build 菜单中的 Build Artifacts,然后单击子菜单中的 Select Build

  1. 现在 运行 构建的 Jar 文件应该 运行 没有任何问题。

我想您在 运行 jar 文件时遇到了异常。您正在获取该 jar 文件,因为该 jar 文件中没有包含 javakata.mail 库。

您可以在 运行 jar 文件时将依赖项指定到类路径中。或者,为了将依赖项捆绑在 jar 文件中,您可以使用 maven assembly 插件创建一个分解的 jar 文件(来自依赖项的 .类 将被提取并压缩到 jar 中)

运行 它与 mvn clean compile assembly:single

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>de.ff.JavaMailTest.SendEmailTLS</mainClass>
      </manifest>
    </archive>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
  </configuration>
</plugin>