与WebApp运行时相比,jUnit加载另一个类

时间:2015-09-25 09:45:56

标签: maven junit cron tomcat7 javax.mail

我正在开发一项功能,其中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的分辨率不同。

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

1 个答案:

答案 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版本,与服务器版本兼容,我也使用运行时提供的库