大家好:今天我们运行的是 Tomcat 9.0.5 和quartz 2.3。我们想迁移到 Tomcat 10,但quartz 2.3 损坏了。你知道quartz 2.4 是否可以与 Tomcat 10 配合使用吗? 谢谢 彼得罗
Tomcat 10.0 是 Jakarta Servlet 5.0 容器。这基本上意味着它使用新的
jakarta.servlet.*
软件包而不是 javax.servlet.*
,而它在 9.0 版本上有 很少的改进。
另一方面,它与所有依赖 Java EE Servlet 直至 4.0 的库(这是绝大多数库)二进制不兼容。
Quartz 也不例外:即使是
master
git 分支仍然使用 javax.servlet
,因此正式版本将无法在 Tomcat 10.0 上运行。但是,您可以对代码进行分支,将类中的(几乎)所有javax.*
更改为jakarta.*
,例如this,然后重新编译。
就我个人而言,我认为迁移到 Tomcat 10.0 没有任何优势,这意味着要么放弃对 Tomcat 9.0 的支持,维护两个版本的 Web 应用程序,要么使用一些 ClassTransformer
技巧。
编辑: Quartz 似乎已经开始了 Jakartification 流程(参见 PR #913),但尚未发布。
即:
@WebListener
public class QuartzContextListener extends QuartzInitializerListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// Scheduler are started in web.xml parm FILE
super.contextInitialized(sce);
// Get Access to the Factory
ServletContext ctx = sce.getServletContext();
factory = (StdSchedulerFactory) ctx.getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);
// Register the Listeners implemented by this Class
//addListeners();
// Default State
//SchedulerState = SchedulerStateEnum.SHUTDOWN;
// Start the Scheduler
startScheduler();
} //contextInitialized
@Override
public void contextDestroyed(ServletContextEvent sce) {
// De-Register the Listeners implemented by this Class
//removeListeners();
// Destroy Last - Order of Operation
super.contextDestroyed(sce);
} //contextDestroyed
public static void startScheduler() {
try {
if( getScheduler().isShutdown() || getScheduler().isInStandbyMode() ) {
getScheduler().start();
}
} catch(SchedulerException ex) {
throw new RuntimeException(ex);
}
}
}