我正在尝试通过 Java Mail API 发送电子邮件,它在我的笔记本电脑上运行良好。当我在 Heroku 中做同样的事情时,我得到了这个:
java.lang.NoSuchMethodError: com.sun.mail.util.TraceInputStream.(Ljava/io/InputStream;Lcom/sun/mail/util/MailLogger;)V
at com.sun.mail.smtp.SMTPTransport.initStreams(SMTPTransport.java:2014)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1936)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654)
at javax.mail.Service.connect(Service.java:291)
at ...
这是我的
pom.xml
:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mailapi</artifactId>
<version>1.4.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.3</version>
<scope>runtime</scope>
</dependency>
我猜 Heroku JDK 中有另一个版本的 Java Mail API,它没有这个构造函数...如何解决这个问题?
默认情况下,在最新 Heroku 堆栈上运行的 Java 应用程序使用 OpenJDK 8。
您的问题似乎与实际的 JVM 实现无关,而是由于 classpath 中缺少
smtp-1.5.1.jar
。为了确保正确加载 TraceInputStream,请尝试以下操作:
java.net.URL classUrl = this.getClass().getResource("com.sun.mail.util.TraceInputStream");
out.println(classUrl.getFile());
我也面临同样的问题。这是因为我的库中没有 TraceInputStream 类。我只需将库降级到 1.4.4 就可以了。
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>smtp</artifactId>
<version>1.4.4</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>mailapi</artifactId>
<version>1.4.4</version>
</dependency>
您混合了不同版本的 API 和实现;不要那样做。 就此而言,您只需要 com.sun.mail:javax.mail 依赖项。 如果 Heroku 未在运行时环境中提供它,您需要将其打包到您的应用程序中。 确保 JavaMail jar 文件最终位于应用程序的 WEB-INF/lib 目录中。
从@Osanda Deshan 获取参考。添加以下
gradle
依赖项对我有用。
implementation 'javax.mail:javax.mail-api:1.4.4'
implementation 'javax.mail:mail:1.4.4'
使用 相同的版本号
jakarta.mail-api
和 jakarta.mail
可以避免此问题。
<dependency>
<groupId>jakarta.mail</groupId>
<artifactId>jakarta.mail-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>
<version>2.0.1</version>
</dependency>