程序在IDE中运行,但不在.jar文件中运行

问题描述 投票:0回答:2

我正在创建一个更大的程序,每当事件发生时都会将电子邮件发送到用户帐户,而现在我只专注于使电子邮件发送工作。

现在,我在IDE(IntelliJ)中完美运行,没有错误或警告,但在我jar文件并在terminal中运行后,每次程序尝试发送电子邮件时都会出错。

我假设我的文件错误,因为它在IDE工作完全正常,但我不太确定。我已经向我提出了类似的问题,但没有找到可行的解决方案。

这是terminal中存在问题的文件

package handler;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import java.util.Properties;

public class Sender {

    private Sender(){}

    private static final String SENDERS_GMAIL = "[email protected]";
    private static final String SENDERS_PASSWORD = "mypassword";

    private static final String RECEIEVES_EMAIL = "[email protected]";

    private static Properties mailServerProperties;
    private static Session mailSession;
    private static MimeMessage mailMessage;

    public static void sendMail(String emailBody) throws Throwable
    {
        mailServerProperties = System.getProperties();
        mailServerProperties.put("mail.smtp.port", "587");
        mailServerProperties.put("mail.smtp.auth", "true");
        mailServerProperties.put("mail.smtp.starttls.enable", "true");

        mailSession = Session.getDefaultInstance(mailServerProperties);

        mailMessage = new MimeMessage(mailSession);
        mailMessage.addRecipient(RecipientType.BCC, new InternetAddress(RECEIEVES_EMAIL));
        mailMessage.setSubject("Test Email");
        mailMessage.setContent(emailBody, "text/html");

        Transport transport = mailSession.getTransport("smtp");
        transport.connect("smtp.gmail.com", SENDERS_GMAIL, SENDERS_PASSWORD);
        transport.sendMessage(mailMessage, mailMessage.getAllRecipients());
        transport.close();
    }
}

每当我在.jar中运行terminal时,这就是我得到的错误:

    C:\Users\genlap\EmailSender>java -jar SendEmail.jar
javax.mail.NoSuchProviderException: No provider for smtp
        at javax.mail.Session.getProvider(Session.java:460)
        at javax.mail.Session.getTransport(Session.java:655)
        at javax.mail.Session.getTransport(Session.java:636)
        at handler.Sender.sendMail(Sender.java:37)
        at handler.ManageService.run(ManageService.java:32)
        at java.lang.Thread.run(Unknown Source)
Message failed to be sent.

Sender文件中出错的行是

Transport transport = mailSession.getTransport("smtp");

有谁知道我怎么解决这个问题?

java cmd jar javamail executable-jar
2个回答
1
投票

您要么不在SendEmail.jar中包含依赖项,要么缺少指向它们的MANIFEST.MF条目。由于当您从命令行执行java -jar时,IntelliJ用于构建和运行应用程序的依赖项不可用。

最简单的方法是创建一个包含所有依赖项的胖JAR。如果您使用Maven,您可以查看this answer或使用Maven Shade Plugin


0
投票

如果您通过从JavaMail jar文件中取出类文件并将它们放入应用程序jar文件来创建应用程序,那么您将丢失JavaMail jar文件中的所有META-INF文件。最好的方法是找到一个不需要重新打包JavaMail jar文件的解决方案,例如One-JAR

© www.soinside.com 2019 - 2024. All rights reserved.