直接运行Jetty源码Main类启动Web应用 不使用start.jar方案
问题现象
直接执行Main类通过Jetty源码启动Web应用时,控制台输出如下报错:
ERROR : No enabled jetty modules found! INFO : ${jetty.home} = /Users/zhangsan/git_repo/servlet-container/jetty.project INFO : ${jetty.base} = /Users/zhangsan/git_repo/servlet-container/jetty.project ERROR : Please create and/or configure a ${jetty.base} directory. Usage: java -jar $JETTY_HOME/start.jar [options] [properties] [configs] java -jar $JETTY_HOME/start.jar --help # for more information
报错核心为未找到已启用的Jetty模块,要求创建并配置${jetty.base}目录,需求为不通过start.jar方式完成Jetty Web应用启动。
问题根因
当前直接运行的是Jetty的org.eclipse.jetty.start.Main入口类,这个类本身就是start.jar的启动入口,设计逻辑面向命令行启动场景,会强制校验${jetty.base}下的模块启用配置,不适合直接编码/嵌入式启动场景。
可行解决方案
方案1:纯编码嵌入式启动(推荐,完全不依赖start.jar与模块配置)
这是最通用的无start.jar启动方式,全程手动组装Jetty核心组件,不会触发任何模块校验逻辑:
- 不要直接运行Jetty源码内置的
org.eclipse.jetty.start.Main类 - 自行编写启动入口类,手动初始化Server、连接器、Web上下文,示例代码如下:
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; public class JettyLauncher { public static void main(String[] args) throws Exception { // 初始化Server实例,指定监听端口 Server server = new Server(8080); // 配置Web应用上下文 WebAppContext webAppContext = new WebAppContext(); // 指定Web资源根路径,替换为你项目的webapp目录实际路径 webAppContext.setResourceBase("src/main/webapp"); // 指定服务上下文路径 webAppContext.setContextPath("/"); // 可选:关闭内存映射文件,避免Windows环境下静态资源锁定问题 webAppContext.setInitParameter( "org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false" ); // 绑定Web上下文到服务实例 server.setHandler(webAppContext); // 启动服务并阻塞等待请求 server.start(); server.join(); } }
- 直接运行你编写的
JettyLauncher类即可完成启动。
方案2:复用Jetty模块体系,跳过start.jar命令行启动
如果需要使用Jetty的官方模块扩展能力,又不想通过java -jar start.jar的方式启动,可以按如下步骤操作:
- 新建独立目录作为自定义
jetty.base,禁止直接使用Jetty源码根目录作为jetty.base,源码目录默认无模块启用配置,必然触发模块找不到的报错 - 进入新建的
jetty.base目录,执行一次初始化命令生成模块配置:
# 替换为你实际的jetty.base路径 cd /path/to/your/custom/jetty-base # 按需添加你需要的模块,示例添加http、webapp、deploy三个基础模块 java -cp /path/to/jetty/compiled/classes org.eclipse.jetty.start.Main --add-to-start=http,webapp,deploy
- 编写自定义启动类,提前指定系统属性后再初始化Server:
public class ModuleJettyLauncher { public static void main(String[] args) throws Exception { // 手动指定jetty.home与jetty.base路径 System.setProperty("jetty.home", "/Users/zhangsan/git_repo/servlet-container/jetty.project"); System.setProperty("jetty.base", "/path/to/your/custom/jetty-base"); // 按业务需求初始化Server、配置Handler与模块 Server server = new Server(8080); // 省略你的业务配置逻辑 server.start(); server.join(); } }
- 运行自定义的
ModuleJettyLauncher类即可。
内容的提问来源于stack exchange,提问作者huifer
相关产品推荐
相关产品推荐

