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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值