java.lang.NoSuchMethodError: com.sun.mail.util.TraceInputStream

java.lang.NoSuchMethodError: com.sun.mail.util.TraceInputStream

我正在尝试通过 Java 邮件 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());

您混合了 API 和实现的不同版本;不要那样做。就此而言,您只需要 com.sun.mail:javax.mail 依赖项。如果 Heroku 没有在运行时环境中提供它,您需要将它打包到您的应用程序中。确保 JavaMail jar 文件位于应用程序的 WEB-INF/lib 目录中。

我也遇到了同样的问题。这是因为我的库中没有 class 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>