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

时间:2019-03-07 15:30:16

标签: java cmd jar javamail executable-jar

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

现在,我已经在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 = "myemail@email.com";
    private static final String SENDERS_PASSWORD = "mypassword";

    private static final String RECEIEVES_EMAIL = "myemail@email.com";

    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");

有人知道我该怎么解决吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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