我正在开发一项功能,其中Cron作业将通过javax.mail触发连接,并扫描某个IMAP帐户的所有传入邮件。
它是Liferay Portlet的一部分,使用JSF-2和Maven构建,并部署在Tomcat服务器上。
我已经构建了一个成功执行此场景的jUnit Test,它运行与从Cron Job调用的完全相同的函数。我通过执行maven build package
目标进行了此测试,而我的Maven正在使用与Tomcat相同的JVM。
但是在服务器中部署WebApp并且Cron Trigger启动后,我收到了这个错误:
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
的分辨率不同。
为什么会发生这种情况,如何确保在所有情况下都加载正确的类?
答案 0 :(得分:0)
通过跟踪错误,我发现在javax.mail
加载了tomcat/ext/lib
的不同版本,并在服务器运行并且在服务器上下文中启动了流程时覆盖了我的。{ p>
最后,我设法通过从
更改我的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版本,与服务器版本兼容,我也使用运行时提供的库