Jetty是什么?为什么它比Tomcat更轻量
Jetty是一款由Eclipse基金会维护的开源Java Web服务器和Servlet容器,以体积小、启动快、嵌入性强著称,在微服务架构和云原生场景下,多数情况下比Tomcat更节省资源。
很多朋友第一次接触Jetty时都会问:它不是个IDE吗?其实Eclipse Jetty和Eclipse IDE是两回事,Jetty是一个可以独立运行的Web服务器,也可以作为库嵌入到你的Java程序中,业内专家指出,Jetty的设计哲学就是“够用就好”,它不像Tomcat那样追求大而全,而是把核心功能做到极致精简。
用一个场景来说明:假设你的服务器只有2G内存,部署一个Spring Boot应用,用Tomcat可能占用400MB,而Jetty只需要200MB左右,这意味着同样的硬件配置,你能多跑几个服务实例,对于追求成本控制的中小团队来说,这个优势相当实在。
Jetty下载安装完整步骤与JDK版本要求
前置条件:确认JDK版本
Jetty 11及以上版本要求JDK 11+,Jetty 12已经支持到JDK 17和JDK 21,安装前先执行命令确认环境:
java -version
如果输出类似“openjdk version 17.0.8”,说明环境满足要求,如果版本太低,需要先安装对应版本的JDK。
下载与解压:从官网获取发行包
Jetty官方提供两种发行包:标准版(Standard)和模块化版(Modules),生产环境推荐使用标准版,它预置了常用模块,下载步骤如下:
- 打开Eclipse Jetty官网(jetty.org),进入“Download”页面
- 选择最新的稳定版本(当前稳定版为Jetty 12系列)
- 下载
.tar.gz压缩包(Linux/macOS)或.zip压缩包(Windows) - 将压缩包上传至服务器并解压
tar -zxvf jetty-12.0.14.tar.gz mv jetty-12.0.14 /usr/local/jetty
启动与停止:一条命令搞定
Jetty的启动命令非常简洁,进入安装目录后执行:
cd /usr/local/jetty java -jar start.jar
默认监听8080端口

,启动完成后浏览器访问http://服务器IP:8080,看到Jetty的欢迎页面就算安装成功,停止服务时直接按Ctrl+C,或者使用jstack定位进程后kill。
Jetty配置详解:端口、JVM参数与虚拟主机
修改端口:从8080到自定义端口
默认端口是8080,但生产环境往往需要改成80或443,Jetty的端口配置在start.d目录下的http.ini文件中,打开后找到jetty.http.port这一行:
jetty.http.port=80
改完后重启Jetty,注意Linux下使用1024以下端口需要root权限,或者通过setcap命令赋予Java二进制文件绑定低端口的权限。
内存与GC调优:避免频繁Full GC
Jetty默认的JVM参数比较保守,高并发场景下需要手动调整,编辑bin/jetty.sh文件,找到JAVA_OPTIONS变量,添加以下参数:
JAVA_OPTIONS="-Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
其中-Xms1g指定初始堆大小,-Xmx2g指定最大堆大小,G1GC是适合多核服务器的垃圾回收器。
虚拟主机配置:一台服务器跑多个站点
Jetty支持在同一实例上配置多个虚拟主机,在webapps目录下创建多个应用目录,然后在start.d目录的jetty.xml中增加VirtualHost配置:
<Set name="virtualHosts">
<Array type="java.lang.String">
<Item>www.example1.com</Item>
<Item>www.example2.com</Item>
</Array>
</Set>
这样同一个IP的不同域名就能访问不同的应用。
Jetty和Tomcat哪个好?生产环境选型对比
这是Jetty配置教程里被问得最多的问题,行业共识认为,两者没有绝对的优劣,关键看应用场景。
| 对比维度 | Jetty | Tomcat |
|---|---|---|
| 启动速度 | 秒级启动 | 秒级启动,略慢 |
| 内存占用 | 较低 | 较高 |
| 配置复杂度 | 模块化,简洁 | XML配置,稍繁琐 |
| 嵌入支持 | 极佳,专为嵌入设计 | 支持,但代码相对复杂 |
| 集群能力 | 依赖外部方案 | 原生支持较完善 |
| 社区活跃度 | 活跃 | 非常活跃 |
从实际使用场景来看:
- 微服务场景:Spring Boot默认内嵌的Web容器就是Tomcat,但也可以切换到Jetty,切换后启动速度快约30%
- 高并发IO密集场景:Jetty的NIO模型比Tomcat的BIO模型更高效,能支撑更多并发连接
- 传统企业应用:如果项目依赖JSP、JSF等Java EE规范,Tomcat兼容性更好
生产环境Jetty配置的常见问题排查
启动报错“Address already in use”
这个错误说明端口被占用,先用lsof -i:8080查看哪个进程占用了端口,找到PID后kill掉,或者直接修改http.ini换个端口。
访问403错误:目录权限问题
Jetty默认只允许访问webapps目录下的应用,如果403可能是应用目录权限不足,检查目录所有者和权限:
chown -R jetty:jetty /usr/local/jetty/webapps/ chmod -R 755 /usr/local/jetty/webapps/
修改配置不生效的排查思路
改完配置后记得先停止再启动,而不是用restart命令,Jetty有些模块的配置在启动时才加载,热重启不一定能生效。
Jetty配置HTTPS证书的两种方式
使用JDK自带的keytool生成自签名证书
开发环境测试HTTPS时,可以用keytool快速生成证书:
keytool -genkeypair -alias jetty -keyalg RSA -keysize 2048 -validity 365 -keystore keystore.jks
然后将生成的keystore.jks放到Jetty的etc目录下,在start.d目录创建ssl.ini文件并添加:
jetty.ssl.keystore.path=etc/keystore.jks jetty.ssl.keystore.password=你的密码 jetty.ssl.keymanager.password=你的密码
配置正式SSL证书

正式环境建议使用云厂商的免费证书(如简米云、酷番云每年可免费申请20张),拿到证书后需要转换为PKCS12格式,因为Jetty 12默认使用PKCS12:
openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.p12 -name jetty
然后在ssl.ini中指定PKCS12文件和密码,重启服务即可。
提升Jetty性能的三个关键设置
线程池调整:避免线程饥饿
Jetty默认线程池大小为200,高并发下需要调整,在start.ini中添加:
jetty.threadPool.maxThreads=500 jetty.threadPool.minThreads=50
开启HTTP/2协议
HTTP/2能显著提升页面加载速度,在start.ini中启用HTTP/2模块:
java -jar start.jar --add-modules=http2
然后配置http2.ini,监听同端口即可。
启用Gzip压缩
在webapps目录的WEB-INF/web.xml中添加Gzip过滤器,减少传输体积:
<filter> <filter-name>GzipFilter</filter-name> <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class> </filter>
Jetty安装配置常见问题解答
Jetty启动报错“java.lang.UnsupportedClassVersionError”怎么解决?
这是JDK版本不匹配的问题,检查你安装的JDK版本是否满足Jetty版本的要求,Jetty 11需要JDK 11+,Jetty 12需要JDK 17+,建议直接安装JDK 17或JDK 21,兼容性最好。
Jetty能直接部署war包吗?
可以,Jetty兼容标准的war包部署方式,将war包拷贝到webapps目录下,启动时会自动解压并部署,与Tomcat的部署逻辑基本一致,没有额外学习成本。
Jetty在Windows下安装和Linux下有什么差别?
Windows下需要先配置JAVA_HOME环境变量,然后双击start.jar或在命令行执行同样的java -jar start.jar命令,需要注意Windows防火墙默认会拦截外部访问,需要在防火墙设置中放行Jetty使用的端口,其他配置步骤和Linux完全一致。

