ZetCode

基本管理

最后修改于 2024 年 1 月 27 日

Jetty 教程的这部分介绍了 Jetty 的基本管理和配置。

首先,我们需要设置好基本的 Jetty 环境变量。环境变量在系统范围的 /etc/environment 文件或用户的 .profile.bashrc (Bash shell) 文件中设置。

$ echo $JETTY_HOME
/home/janbodnar/bin/jetty
$ echo $JETTY_BASE
/home/janbodnar/prog/jetty/my-base

现在,我们可以在命令中引用 Jetty 主目录和 Jetty 基础目录这两个变量。

Jetty 基础目录

Jetty 基础目录是我们自定义的 Jetty 环境,我们在此放置自己的配置文件、日志,以及部署目录。部署目录的默认名称是 webapps

要创建 Jetty 基础目录,我们创建一个新目录,并使用 start.jar 命令启用必要的模块。然后从该目录启动 Jetty。或者,我们将 jetty.base 属性指定为命令行选项。

$ cd $JETTY_BASE
$ java -jar $JETTY_HOME/start.jar

这两个命令从 Jetty 基础目录启动 Jetty。Jetty 会自动加载位于该目录的配置文件 — start.ini 文件,以及可选的位于 resourcesmodulesetc 子目录中的文件。

$ java -jar $JETTY_HOME/start.jar jetty.base=$JETTY_BASE

如果我们不在 Jetty 基础目录中,可以通过指定 jetty.base 命令行选项来启用 Jetty 基础环境。

start.jar 命令

位于 Jetty 主目录中的 start.jar 工具用于启动 Jetty、提供信息以及执行一些配置设置。

$ java -jar $JETTY_HOME/start.jar --help

--help 选项会打印当前命令行选项列表和一些基本用法帮助。

$ ls -l $JETTY_BASE
total 0
$ cd $JETTY_BASE
$ java -jar $JETTY_HOME/start.jar --add-to-start=deploy,http
INFO: deploy          initialised in ${jetty.base}/start.ini (appended)
MKDIR: ${jetty.base}/webapps
INFO: webapp          initialised transitively
INFO: servlet         initialised transitively
INFO: security        initialised transitively
INFO: server          initialised transitively
INFO: http            initialised in ${jetty.base}/start.ini (appended)
INFO: server          initialised transitively
$ ls
start.ini  webapps

Jetty 是一个高度模块化的系统。--add-to-start 选项通过将 Jetty 模块追加到 ${jetty.base}/start.ini 文件中来启用它们。该命令启用了 deploy 和 HTTP 模块,以及它们所依赖的模块。该命令还创建了 start.ini 文件和 webapps 部署目录。start.ini 文件在启动时被 Jetty 加载。

$ java -jar $JETTY_HOME/start.jar --list-modules
...
Jetty Active Module Tree:
-------------------------
 + Module: server [enabled]
   + Module: http [enabled]
   + Module: security [enabled]
   + Module: servlet [enabled]
     + Module: webapp [enabled]
       + Module: deploy [enabled]
...

这里我们看到 --list-modules 选项的部分输出。它列出了所有可用的 Jetty 模块 — 活动的和非活动的。

$ java -jar $JETTY_HOME/start.jar --list-config
...
Jetty Active XMLs:
------------------
 ${jetty.home}/etc/jetty.xml
 ${jetty.home}/etc/jetty-http.xml
 ${jetty.home}/etc/jetty-deploy.xml

--list-config 选项会列出配置设置,包括 Java 和 Jetty 环境、JVM 参数、属性、Server 类路径以及 XML 配置文件。部分输出显示了 Jetty 加载的活动 XML 配置文件。

部署目录

部署目录是我们部署 WAR 文件的目录。该目录的默认名称是 webapps。该目录位于 Jetty 主目录和 Jetty 基础目录中。

...
<Set name="monitoredDirName"><Property name="jetty.base" default="." />/
<Property name="jetty.deploy.monitoredDirName" default="webapps"/></Set>
...

默认部署目录的名称在 $JETTY_HOME/etc/jetty-deploy.xml 文件中指定。

$ java -jar $JETTY_HOME/start.jar jetty.deploy.monitoredDirName=webapps2

我们可以在命令行上设置属性值。

$ cat start.ini 
#
# Initialize module deploy
#
--module=deploy
## DeployManager configuration
# Monitored Directory name (relative to jetty.base)
jetty.deploy.monitoredDirName=webapps3

另一种可能性是在 start.ini 文件中的 deploy 模块部分设置部署目录名称。

$ cat myjetty.properties 
jetty.deploy.monitoredDirName=webapps4
$ java -jar $JETTY_HOME/start.jar myjetty.properties 

部署目录可以设置在传递给 start.jar 工具的属性文件中。

我们已经展示了设置部署目录的四个位置。如果存在冲突,则从优先级最高的选项中获取值。优先级顺序如下:(a) Java 属性文件;(b) 命令行选项;(c) Jetty 基础目录的 start.ini 文件;(d) 位于 Java 主目录 etc 目录中的 jetty-deploy.xml 文件。

Jetty XML 文件

Jetty 可以通过 XML 配置文件进行配置。jetty.xml 是默认的 Jetty 配置文件。它配置了 server 类、ThreadPool、连接器、handler 结构、部署管理器、登录服务和请求日志。jetty-web.xml 是一个可以与特定 Web 应用程序捆绑的 Jetty 配置文件。jetty-env.xml 是一个可选的 Jetty 配置文件,用于为单个 Web 应用程序配置 JNDI 资源。webdefault.xml 配置文件在 Web 应用程序自己的 web.xml 文件之前应用。它用于避免 Web 应用程序在其自身的 web.xml 文件中定义大量 housekeeping 和容器特定元素。override-web.xml 是一个 Web 应用程序配置文件,在应用程序自己的 web.xml 文件之后应用。

应用程序上下文

上下文路径 是 URL 路径的一部分,用于选择将传入请求路由到的 Web 应用程序。上下文路径可以通过方法调用(在嵌入式 Jetty 中)、从 WAR 文件名派生、在 deployer XML 文件或 jetty-web.xml 中指定。下一个示例将使用 jetty-web.xml 文件设置应用程序的上下文路径。该文件位于 WEB-INF 目录内。

$ tree
.
├── build.xml
└── src
    ├── com
    │   └── zetcode
    └── web
        ├── index.html
        └── WEB-INF
            └── jetty-web.xml

5 directories, 3 files

我们列出了项目的目录结构。

index.html
<!DOCTYPE html>
<html> 
<body>

Simple page.

</body> 
</html>

这是一个简单的 HTML 文件。

jetty-web.xml
<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" 
    "http://www.eclipse.org/jetty/configure.dtd">
 
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/myapp</Set>  
  <Get class="org.eclipse.jetty.util.log.Log" name="rootLogger">
    <Call name="warn"><Arg>Web application is deployed</Arg></Call>
  </Get>    
</Configure>

jetty-web.xml 文件中,我们将上下文设置为 /myapp。我们还在部署时记录一条消息。

build.xml
<?xml version="1.0" encoding="UTF-8"?>

<project name="AppContext" default="archive">
    
    <property name="name" value="appcontext"/>
    <property environment="env"/>
    <property name="src.dir" value="src"/>
    <property name="web.dir" value="${src.dir}/web"/>
    <property name="dist.dir" location="dist"/>
    <property name="deploy.path" location="${env.JETTY_BASE}/webapps"/>
  
    <target name="init">
        <mkdir dir="${dist.dir}"/>
    </target>     
  
    <target name="archive">
        <war destfile="${dist.dir}/${name}.war" needxmlfile="false">
            <fileset dir="${web.dir}"/>
        </war>
        <echo>Archive created</echo>
    </target> 
  
    <target name="clean" depends="init">
        <delete dir="${dist.dir}"/>
        <echo>Cleaning completed</echo>
    </target>  
    
    <target name="deploy" depends="archive">
        <copy file="${dist.dir}/${name}.war" overwrite="true" 
            todir="${deploy.path}"/>
        <echo>Archive deployed</echo>
    </target>    
    
</project>

这是 Ant 构建文件。

<property environment="env"/>

environment 属性设置了使用 OS 环境变量的 prefix。

<property name="deploy.path" location="${env.JETTY_BASE}/webapps"/>

我们使用 JETTY_BASE 环境变量来定义部署路径。

$ curl localhost:8080/myapp/
<!DOCTYPE html>
<html> 
<body>
Simple page.
</body> 
</html>

我们使用选定的上下文路径连接到 Web 应用程序。如果我们没有显式指定上下文文件,它将从 WAR 文件名派生,该文件名在 build.xml 文件的第三行给出。

部署描述符

部署描述符是用于部署 Web 应用程序的 XML 文件。XML 文件的名称必须与 WAR 文件的名称匹配。如果部署目录中同时存在 WAR 文件和 XML 文件,则使用 XML 文件进行部署。

我们使用前面的示例代码。

appcontext.xml
<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" 
    "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/myapp2</Set>
  <Set name="war">/home/janbodnar/prog/jetty/appcontext/dist/appcontext.war</Set>
</Configure>

在部署描述符中,我们设置了上下文路径并使用绝对路径指定了 WAR 文件。

jetty-web.xml
<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" 
    "http://www.eclipse.org/jetty/configure.dtd">
 
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<!--   <Set name="contextPath">/myapp</Set>   -->
  <Get class="org.eclipse.jetty.util.log.Log" name="rootLogger">
    <Call name="warn"><Arg>Web application is deployed</Arg></Call>
  </Get>    
</Configure>

jetty-web.xml 在所有其他配置应用于 Web 应用程序之后被调用。因此,我们注释掉了指定上下文路径的行。

$ curl localhost:8080/myapp2/
<!DOCTYPE html>
<html> 
<body>
Simple page.
</body> 
</html>

修改后的上下文路径有效。

在本章中,我们展示了 Jetty 服务器的一些基本管理操作。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面有十多年的经验。

列出所有Java教程