java.lang.NoSuchMethodError com.sun.mail.util.TraceInputStream
在用java实现发送邮件功能时,jdk1.8的两台windows主机上可以正常工作,在jdk1.7的Ubuntu主机上,发送邮件时就会抛异常:
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中引入的jar包如下:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mailapi</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.5.0-b01</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.0</version>
</dependency>
这个错误其实是很明显的jar包冲突引起的,度娘也说了:说javaEE5已经带了这个方法,但有问题,而程序又没有去加载你pom中的jar,所以就找不到这个类了。Google一下的解决方案是:
By default, Java apps running on latest Heroku stack use OpenJDK 8.
Your problem does not seems related to the actual JVM implementation but rather due to the missing smtp-1.5.1.jar in classpath . To be sure to load correctly TraceInputStream try this :
java.net.URL classUrl = this.getClass().getResource("com.sun.mail.util.TraceInputStream");
out.println(classUrl.getFile());
我大概明白它的意思其实是去加载你用pom下的jar包里面的这个class,读者也可以尝试用ClassLoader去加载一下这个class试一下,其实,笔者这里用了一个比较变态的不靠谱方法:
我在项目里新建了一个与TraceInputStream同包同名的类,代码原封不动,其实这里的解决方案的本质,也是用到了java的ClassLoader机制,AppClassLoader加载了我的项目的类,自然就不再加载第三方(非java核心类库)中的同一个类,然后程序自然就能找到上面那个Class了。
后面有时间的话,会研究一下用ClassLoader来加载这个Class,感觉这样更靠谱些,您说呢?