1. 概述
本文将快速介绍Jetty Web服务器,并详细说明部署WAR文件的多种方法。
Jetty是一个开源的Java HTTP Web服务器和Servlet容器。在Java生态系统中,Jetty更常用于机器间通信场景。
2. 项目准备
最新版Jetty可通过此链接下载。我们将使用Maven从命令行创建一个基础Java Web应用作为示例。
本文使用Jetty 9.x(当前最新版本)。
在控制台中执行以下命令创建项目:
mvn archetype:generate -DgroupId=com.baeldung -DartifactId=jetty-app
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
该命令将在当前目录创建jetty-app
文件夹,包含完整的Java Web应用结构。这只是Maven创建Java应用的多种方式之一,但足以满足我们的需求。
由于需要处理WAR文件,切换到项目根目录并构建:
cd jetty-app
使用Maven构建:
mvn package
构建完成后,WAR文件将生成于jetty-app/target/jetty-app.war
。
3. Jetty核心概念
上下文路径(Context path)
相对于服务器地址的路径,代表Web应用的名称。例如,若应用部署在$JETTY_HOME/webapps/myapp
目录,则访问URL为http://localhost/myapp
,上下文路径为/myapp
。
WAR文件
以ZIP格式打包的Web应用目录结构,扩展名为.war(Web Archive缩写)。Java Web应用通常打包为WAR文件进行部署,可通过命令行或Eclipse等IDE创建。
4. 通过复制WAR文件部署
最简单的部署方式是将WAR文件复制到$JETTY_HOME/webapps
目录。
复制后,切换到$JETTY_HOME
目录启动服务器:
java -jar start.jar
Jetty启动时会扫描webapps
目录自动部署应用。新应用将部署在/jetty-app
上下文路径。
浏览器访问http://localhost:8080/jetty-app
,应显示"Hello world!"页面。
5. 使用上下文文件部署
Jetty允许通过创建上下文文件,部署文件系统中任意位置的WAR包。
即使WAR文件位于桌面或Maven生成的jetty-app/target
目录,只需在$JETTY_HOME/webapps
中创建对应的上下文文件即可。
先删除webapps
中已部署的jetty-app.war
,然后创建jetty-app.xml
文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
"http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/jetty</Set>
<Set name="war">/absolute/path/to/jetty-app.war</Set>
</Configure>
⚠️ 上下文文件名必须与WAR文件名相同(扩展名改为.xml)。注意我们设置了contextPath
为/jetty
,这意味着应用将通过http://localhost:8080/jetty
访问。
这种自定义上下文路径的能力是上下文文件部署方式的核心优势,尤其当应用名称不适合直接作为URL路径时。
6. 使用Jetty Maven插件部署
6.1 默认部署
Jetty Maven插件支持快速测试和迭代开发。只需在pom.xml
中添加插件:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.11.v20160721</version>
</plugin>
最新版本可查看Maven仓库。
确保端口8080的Jetty实例已停止后,在项目根目录执行:
mvn jetty:run
该命令创建新的Jetty实例并部署应用,通过http://localhost:8080
访问。插件会持续扫描项目变化并自动重新部署。
6.2 修改上下文路径
默认部署在根路径/
下。若需指定上下文路径(如/jetty
),修改插件配置:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.11.v20160721</version>
<configuration>
<webApp>
<contextPath>/jetty</contextPath>
</webApp>
</configuration>
</plugin>
重新运行插件后,应用可通过http://localhost:8080/jetty
访问。
6.3 修改端口
当遇到端口占用时(如生产环境使用8080),可修改测试端口:
<configuration>
<webApp>
<contextPath>/jetty</contextPath>
</webApp>
<httpConnector>
<port>8888</port>
</httpConnector>
</configuration>
重新运行后,应用可通过http://localhost:8888/jetty
访问。
✅ 注意:Jetty Maven插件会创建独立实例,无需预先安装Jetty服务器。
7. 使用Jetty Runner部署
Jetty Runner提供快速部署Web应用的能力,同样无需安装独立Jetty服务器。
7.1 Jetty Runner准备
从Maven仓库下载最新版jetty-runner.jar。将jar文件放置任意位置,并准备好WAR文件路径。
支持通过命令行参数配置,可同时部署多个应用到不同上下文和端口。
本文将jetty-runner.jar与jetty-app
目录放在同级。
7.2 基础部署
执行以下命令部署WAR:
java -jar jetty-runner-9.4.0.M1.jar jetty-app/target/jetty-app.war
命令创建Jetty实例并部署WAR,WAR路径支持绝对或相对路径。通过http://localhost:8080
访问。
7.3 指定上下文路径部署
使用--path
参数指定上下文路径:
java -jar jetty-runner-9.4.0.M1.jar --path /jetty jetty-app/target/jetty-app.war
通过http://localhost:8080/jetty
访问。
7.4 指定端口部署
使用--port
参数指定端口:
java -jar jetty-runner-9.4.0.M1.jar --port 9090 jetty-app/target/jetty-app.war
通过http://localhost:9090
访问。
7.5 部署多个WAR
使用多个--path
参数部署不同应用:
java -jar jetty-runner --path /one one.war --path /two two.war
访问方式:
one.war
→http://localhost:8080/one
two.war
→http://localhost:8080/two
8. 使用Cargo Maven插件部署
Cargo是支持标准化操作多种应用容器的通用库。
8.1 Cargo部署准备
本节说明如何使用Cargo Maven插件将WAR部署到Jetty 9.x。
从命令行创建新项目:
mvn archetype:generate -DgroupId=com.baeldung -DartifactId=cargo-deploy
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
在cargo-deploy
目录创建基础Web应用。若直接部署,浏览器将显示"Hello World!"。
由于项目不包含Servlet,web.xml
内容简单。在WEB-INF
目录创建web.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://Java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://Java.sun.com/xml/ns/javaee
http://Java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>cargo-deploy</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
为简化命令,在Maven的settings.xml
中添加插件组:
<pluginGroups>
<pluginGroup>org.codehaus.cargo</pluginGroup>
</pluginGroups>
8.2 本地部署
修改pom.xml
添加插件配置:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.5.0</version>
<configuration>
<container>
<containerId>jetty9x</containerId>
<type>installed</type>
<home>/path/to/jetty9</home>
</container>
<configuration>
<type>existing</type>
<home>/path/to/jetty9</home>
</configuration>
</configuration>
</plugin>
</plugins>
</build>
✅ 关键配置说明:
containerId
指定容器类型为Jetty 9.xtype="installed"
表示使用已安装的Jetty实例home
指定Jetty安装路径(绝对路径)configuration
的type="existing"
表示使用现有配置
执行以下命令部署:
mvn install
mvn cargo:deploy
成功后访问http://localhost:8080/cargo-deploy
。在$JETTY_HOME/webapps
目录会看到Cargo生成的cargo-deploy.xml
上下文文件。
8.3 远程部署
Jetty默认不支持远程部署。Cargo通过Jetty远程部署器实现此功能。
步骤1:下载部署器
从下载页的tools
部分获取cargo-jetty-7-and-onwards-deployer.war
。
步骤2:配置安全域
在远程Jetty服务器的$JETTY_HOME/etc
目录创建realm.properties
:
admin:password,manager
步骤3:修改部署器安全配置
解压下载的WAR,在WEB-INF/web.xml
中添加安全约束:
<security-constraint>
<web-resource-collection>
<web-resource-name>Jetty Remote Deployer</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Test Realm</realm-name>
</login-config>
重新打包为WAR文件。
步骤4:部署部署器
在远程服务器的$JETTY_HOME/webapps
创建上下文文件cargo-jetty-deployer.xml
:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
"http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/deployer</Set>
<Set name="war">/path/to/cargo-jetty-deployer.war</Set>
<Get name="securityHandler">
<Set name="loginService">
<New class="org.eclipse.jetty.security.HashLoginService">
<Set name="name">Test Realm</Set>
<Set name="config"><SystemProperty name="jetty.home"
default="."/>/etc/realm.properties</Set>
</New>
</Set>
</Get>
</Configure>
启动远程Jetty,访问http://localhost:8080/cargo-jetty-deployer
应显示错误信息(属正常现象)。
步骤5:配置远程部署
修改本地项目的pom.xml
:
<configuration>
<container>
<containerId>jetty9x</containerId>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<cargo.hostname>192.168.1.100</cargo.hostname>
<cargo.servlet.port>8080</cargo.servlet.port>
<cargo.remote.username>admin</cargo.remote.username>
<cargo.remote.password>password</cargo.remote.password>
</properties>
</configuration>
</configuration>
执行部署命令:
mvn clean install
mvn cargo:deploy
9. 通过Eclipse部署
Eclipse支持嵌入服务器,在IDE内完成Web应用部署。
9.1 在Eclipse中嵌入Jetty
- 选择菜单栏
Window
>Preferences
- 左侧导航到
Server
>Runtime Environments
- 点击
Add
选择Jetty版本 - 浏览并选择Jetty安装目录
- 勾选
Enabled
后应用配置
配置后,通过Window
> Show View
> Servers
可管理服务器实例。
9.2 部署到嵌入式Jetty
- 打开
Servers
视图 - 右键点击服务器 >
Add and Remove
- 选择要部署的Web项目
在部署对话框中选择:
- ✅ Exploded Archive(开发模式):修改实时同步,无需重新部署
- ❌ Packaged Archive(生产模式):每次修改需重新部署
9.3 部署到外部位置
当需要部署到非Eclipse管理的位置时(如生产服务器):
- 在
Servers
视图选择<Externally Launched>
- 指定外部Jetty的
$JETTY_HOME/webapps
目录 - 使用生产模式部署,记录
Deploy Location
路径获取WAR文件
10. 通过IntelliJ IDEA部署
10.1 本地配置
- 打开
Run
>Edit Configurations
- 点击
+
>Jetty Server
>Local
- 配置Jetty安装路径(
Jetty Home
) - 设置启动页面和端口(默认8080)
- 切换到
Deployment
标签页 - 点击
+
添加要部署的Artifact
10.2 远程配置
步骤与本地配置类似,但在服务器标签页需指定远程Jetty的安装路径。
11. 总结
本文全面介绍了在Jetty Web服务器中部署WAR文件的多种方法,包括:
- ✅ 直接复制WAR文件到webapps目录
- ✅ 使用上下文文件灵活部署
- ✅ 通过Jetty Maven插件实现开发热部署
- ✅ 使用Jetty Runner快速启动
- ✅ 利用Cargo插件实现本地/远程部署
- ✅ 在Eclipse/IDEA中集成部署
每种方法各有适用场景,开发者可根据实际需求选择最合适的部署策略。对于日常开发,Jetty Maven插件的热部署功能最为高效;而生产环境则推荐使用上下文文件或Cargo插件实现精确控制。