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

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,感觉这样更靠谱些,您说呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章