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.warhttp://localhost:8080/one
  • two.warhttp://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.x
  • type="installed"表示使用已安装的Jetty实例
  • home指定Jetty安装路径(绝对路径)
  • configurationtype="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

  1. 选择菜单栏Window > Preferences
  2. 左侧导航到Server > Runtime Environments
  3. 点击Add选择Jetty版本
  4. 浏览并选择Jetty安装目录
  5. 勾选Enabled后应用配置

Eclipse Jetty配置

配置后,通过Window > Show View > Servers可管理服务器实例。

9.2 部署到嵌入式Jetty

  1. 打开Servers视图
  2. 右键点击服务器 > Add and Remove
  3. 选择要部署的Web项目

添加部署

在部署对话框中选择:

  • Exploded Archive(开发模式):修改实时同步,无需重新部署
  • Packaged Archive(生产模式):每次修改需重新部署

部署类型选择

9.3 部署到外部位置

当需要部署到非Eclipse管理的位置时(如生产服务器):

  1. Servers视图选择<Externally Launched>
  2. 指定外部Jetty的$JETTY_HOME/webapps目录
  3. 使用生产模式部署,记录Deploy Location路径获取WAR文件

10. 通过IntelliJ IDEA部署

10.1 本地配置

  1. 打开Run > Edit Configurations
  2. 点击+ > Jetty Server > Local
  3. 配置Jetty安装路径(Jetty Home
  4. 设置启动页面和端口(默认8080)
  5. 切换到Deployment标签页
  6. 点击+添加要部署的Artifact

10.2 远程配置

步骤与本地配置类似,但在服务器标签页需指定远程Jetty的安装路径。

11. 总结

本文全面介绍了在Jetty Web服务器中部署WAR文件的多种方法,包括:

  • ✅ 直接复制WAR文件到webapps目录
  • ✅ 使用上下文文件灵活部署
  • ✅ 通过Jetty Maven插件实现开发热部署
  • ✅ 使用Jetty Runner快速启动
  • ✅ 利用Cargo插件实现本地/远程部署
  • ✅ 在Eclipse/IDEA中集成部署

每种方法各有适用场景,开发者可根据实际需求选择最合适的部署策略。对于日常开发,Jetty Maven插件的热部署功能最为高效;而生产环境则推荐使用上下文文件或Cargo插件实现精确控制。


原始标题:Deploying Web Applications in Jetty | Baeldung

» 下一篇: Java ArrayList指南