【问题标题】:Program runs in IDE but not as .jar file程序在 IDE 中运行,但不是 .jar 文件
【发布时间】:2019-07-29 13:17:09
【问题描述】:

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

现在,我让它在 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();
    }
}

每当我在terminal 中运行.jar 时,都会出现以下错误:

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

有人知道我该如何解决这个问题吗?

【问题讨论】:

  • 查看this question的答案是否有帮助。
  • @PM77-1 不幸的是,这并没有帮助。我相信我已经将所有必需的依赖项正确添加到.jar。但我可能总是错的

标签: java cmd jar jakarta-mail executable-jar


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。如您所述,我创建了一个“胖”JAR,但问题仍然存在。我猜现在问题出在MANIFEST.MF 上,但由于这是一个自动生成的文件,我不确定如何修复它。你有什么建议吗?
  • 您使用什么构建工具来创建 JAR?马文?还是您使用的是 IntelliJ?
  • 我正在使用 IntelliJ
【解决方案2】:

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

【讨论】:

  • 我将 JavaMail jar 文件作为一个整体使用,我不会将单个类文件取出并将它们添加到应用程序中。我有很多 .jar dependencies 我只是告诉 IDE 打包到我正在创建的输出应用程序文件中
  • IDE如何将这些jar文件添加到应用程序文件中?如果您查看创建的应用程序 jar 文件,您会看到什么?
猜你喜欢
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多