2015-09-25 39 views
0

我正在研究一个功能,其中Cron作业将通过javax.mail触发连接,并扫描某个IMAP帐户的所有传入邮件。与WebApp运行时相比,jUnit加载另一个类

它是使用JSF-2和Maven构建的Liferay Portlet的一部分,并部署在Tomcat服务器上。

我已经构建了一个jUnit测试,可以成功执行这个场景,运行完全相同的函数,它将从Cron作业调用。我通过执行maven build package目标执行了此测试,并且我的Maven与我的Tomcat使用相同的JVM。

但在服务器部署在WebApp和克龙触发踢后,我得到这个错误:

org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger] 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:224) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) 
Caused by: java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger 
    at javax.mail.Session.initLogger(Session.java:226) 
    at javax.mail.Session.<init>(Session.java:210) 
    at javax.mail.Session.getDefaultInstance(Session.java:321) 
    at javax.mail.Session.getDefaultInstance(Session.java:361) 

所以我想这下Tomcat的运行系统或Servlet上下文或石英流动或什么,与jUnit的分辨率相比,com/sun/mail/util/MailLogger的分辨率不同。

为什么会发生这种情况,以及如何确保我在所有情况下都加载了正确的类?

+1

看起来您在类路径中有多个版本的JavaMail。一个是Javamail 1.4.5或更高版本,另一个是JavaMail 1.4.6或更高版本。 – jmehrens

+0

@jmehrens你说得对,我的tomcat使用的是旧版本。不过,我尝试使用完全相同的版本,并且仍然存在问题。检查我的答案更多。 – yannicuLar

+0

是否有新的错误信息? – jmehrens

回答

0

通过跟踪错误,我发现从tomcat/ext/lib加载了javax.mail的不同版本,并且在服务器正在运行并且在服务器上下文中启动流时覆盖了我的。

最后,我设法解决这个问题,通过改变我的javax.mail-API的依赖性和

 <dependency> 
      <groupId>javax.mail</groupId> 
      <artifactId>javax.mail-api</artifactId> 
      <version>1.5.4</version> 
     </dependency> 

<dependency> 
     <groupId>javax.mail</groupId> 
     <artifactId>javax.mail-api</artifactId> 
     <version>1.4.4</version> 
     <scope>provided</scope> 
    </dependency> 

我切换到旧javax.mail-API版本,与服务器兼容,并且我也使用运行时提供的库