如何在嵌入式Jetty中使用Jetty Quickstart及启动优化问题
关于无web.xml的嵌入式Jetty使用Quickstart及类路径扫描的问题
能否在无web.xml的嵌入式Jetty中使用Jetty Quickstart?
可以,但需要调整配置逻辑。Jetty Quickstart原本设计为配合web.xml快速启动,但在无web.xml的嵌入式场景下,你可以通过编程方式引入QuickstartConfiguration,手动定义需要加载的组件,完全不需要依赖web.xml。
如何通过Quickstart取消类路径扫描以缩短启动时间?
你当前的配置中包含AnnotationConfiguration,这会触发类路径扫描(扫描@WebServlet、@WebFilter等注解)。如果要取消扫描,需要移除AnnotationConfiguration,改用QuickstartConfiguration来手动指定需要加载的类或组件。
修改后的核心配置示例:
final WebAppContext context = new WebAppContext(); final ResourceFactory resourceFactory = ResourceFactory.of(context); context.setDisplayName("PORTAL"); context.setContextPath("/"); context.setBaseResource(findWebRoot(resourceFactory)); // 禁用自动发现配置,避免触发扫描 context.setConfigurationDiscovered(false); context.setParentLoaderPriority(true); // 使用QuickstartConfiguration替代AnnotationConfiguration context.setConfigurations(new Configuration[] { new QuickstartConfiguration(), new WebAppConfiguration(), new WebInfConfiguration(), // 移除WebXmlConfiguration,因为无web.xml文件 new MetaInfConfiguration(), new FragmentConfiguration(), new EnvConfiguration(), new PlusConfiguration(), new JettyWebXmlConfiguration(), new JakartaWebSocketConfiguration() }); // 通过Quickstart手动注册组件(示例) QuickstartConfiguration quickstart = context.getBean(QuickstartConfiguration.class); // 手动注册Servlet quickstart.addServlet(YourServlet.class, "/your-path/*"); // 手动注册Filter quickstart.addFilter(YourFilter.class, "/*", EnumSet.allOf(DispatcherType.class)); // 手动注册Listener quickstart.addListener(YourListener.class);
针对后续两个问题的解答
是否可以获取Jetty在类路径扫描期间注册的所有内容?
可以,但需要自定义扩展来收集。比如你可以继承AnnotationConfiguration,重写其扫描相关方法,记录扫描到的Servlet、Filter、Listener等组件信息。不过更高效的方式是直接跳过扫描改用手动注册——毕竟你的目标是缩短启动时间,收集扫描内容反而会增加额外开销。是否可以禁用Jetty的类路径扫描,转而手动指定类?
完全可以,这也是优化启动时间的常用方案。具体操作:
- 移除配置中的
AnnotationConfiguration,避免触发注解扫描; - 禁用自动发现(
context.setConfigurationDiscovered(false)),防止Jetty自动扫描类路径; - 手动通过
WebAppContext的API注册组件:- 注册Servlet:
context.addServlet(YourServlet.class, "/path") - 注册Filter:
context.addFilter(YourFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)) - 注册Listener:
context.addEventListener(new YourListener()) - 注册WebSocket端点:通过
JakartaWebSocketConfiguration的addEndpoint()方法手动添加
- 注册Servlet:
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

