Jetty简介
最后修改于 2024 年 1 月 27 日
这是一篇Jetty入门教程。本教程的目的是帮助您开始使用Jetty。本教程在Linux上创建和测试。本教程涵盖Jetty 11版本。
关于Jetty
Jetty是一个开源项目,提供HTTP服务器、HTTP客户端和Java servlet容器。该项目是Eclipse基金会的一部分。Jetty是一个成熟的项目,始于1995年。Jetty可以轻松地嵌入到设备、工具、框架、应用服务器和集群中。
Jetty还支持其他Java技术,包括
- SPDY
- WebSockets
- JNDI
- JAAS
- OSGi
- AJP
- JMX
安装Jetty
在本文中,我们在本地计算机上进行操作。有关在远程服务器上安装Jetty的详细说明将在单独的章节中提供。首先,我们从Eclipse的下载页面将Jetty下载到我们选择的目录。
$ unzip jetty-home-11.0.7.zip
我们解压缩文件。
$ ls jetty-home-11.0.7 bin etc lib LICENSE.txt modules NOTICE.txt README.adoc start.jar VERSION.txt
我们列出了目录的内容。bin目录包含帮助在Unix系统上运行Jetty的实用脚本。lib目录包含运行Jetty所需的所有JAR文件。modules目录包含模块定义,其中模块是包含Jetty功能的库、依赖项、XML和INI模板文件的配置文件。start.jar用于调用Jetty。
$ export JETTY_HOME=/home/janbodnar/bin/jetty-home-11.0.7
创建一个JETTY_HOME环境变量。
运行Jetty
要运行Jetty服务器,我们使用start.jar文件。
$ java -jar $JETTY_HOME/start.jar --add-modules=server,http
我们创建start.d目录,其中包含服务器的配置。
$ java -jar $JETTY_HOME/start.jar
我们将start.jar文件传递给java命令来运行服务器。start.jar会构建类路径,并使用从该类路径构建的类加载器执行一个主Java类。默认情况下,start.jar机制配置为启动Jetty服务器,但它可以配置为启动任何Java主类。
现在我们可以通过浏览器访问该服务器:https://:8080。
$ curl localhost:8080
<!DOCTYPE html>
<html lang="en">
<head>
<title>Error 404 - Not Found</title>
<meta charset="utf-8">
<style>body { font-family: sans-serif; } table, ...
</head>
<body>
<h2>Error 404 - Not Found.</h2>
...
我们使用命令行工具curl来执行HTTP请求。服务器返回404错误——webapps目录中还没有应用程序。
JETTY_HOME & JETTY_BASE
从Jetty 9.1开始,可以区分独立的Jetty二进制安装(称为Jetty home)与特定环境的自定义(称为Jetty base)。Jetty home是Jetty发行版二进制文件、默认XML配置和默认模块定义的位置。Jetty base是Jetty发行版的配置和自定义的位置。
$ mkdir my-base $ cd my-base/
我们创建my-base目录,它将成为我们的Jetty base。
$ export JETTY_BASE=/home/janbodnar/prog/jetty/my-base
创建一个JETTY_BASE环境变量。Jetty通过环境变量或属性确定Jetty home和Jetty base的位置。
Jetty base的三个重要项是start.d配置目录、start.ini配置文件和webapps目录。我们使用start.jar来启用Jetty的必要模块。--add-module选项将给定模块添加到Jetty启动时启用的模块列表中。
$ java -jar $JETTY_HOME/start.jar --add-module=deploy
创建start.ini文件,并向其中添加deploy模块。同时创建webapps目录。
$ java -jar $JETTY_HOME/start.jar --add-module=http
在start.d目录中创建名为http.ini的http模块配置。
$ tree . ├── resources │ └── jetty-logging.properties ├── start.d │ ├── deploy.ini │ ├── http.ini │ └── server.ini └── webapps 3 directories, 4 files
此时,我们的Jetty base目录中有这些内容。实际上,我们启用了两个以上的模块——模块可能有依赖模块,这些模块也一并被启用。例如,通过启用http模块,我们也激活了server模块。
$ java -jar $JETTY_HOME/start.jar --list-modules
...
Enabled Modules:
----------------
0) resources transitive provider of resources for logging-jetty
1) logging/slf4j transitive provider of logging/slf4j for logging-jetty
dynamic dependency of logging-jetty
2) logging-jetty transitive provider of logging for threadpool
transitive provider of logging for bytebufferpool
transitive provider of logging for server
3) bytebufferpool transitive provider of bytebufferpool for server
init template available with --add-module=bytebufferpool
4) threadpool transitive provider of threadpool for server
init template available with --add-module=threadpool
5) server ${jetty.base}/start.d/server.ini
6) security transitive provider of security for webapp
7) servlet transitive provider of servlet for webapp
8) webapp transitive provider of webapp for deploy
init template available with --add-module=webapp
9) deploy ${jetty.base}/start.d/deploy.ini
10) http ${jetty.base}/start.d/http.ini
--list-modules选项列出所有模块,包括活动和非活动模块。在输出的末尾,我们有一个活动模块的树。
$ pwd /home/janbodnar/prog/jetty/my-base $ java -jar $JETTY_HOME/start.jar
建议位于Jetty base目录中,并通过远程引用start.jar来启动服务器。
第一个Web应用程序
我们使用Jetty创建并部署第一个Web应用程序。该应用程序将显示一个简单的JSP页面。我们从头开始创建Jetty base以启用JSP页面的运行。
$ cd $JETTY_BASE $ java -jar $JETTY_HOME/start.jar --add-to-start=http,deploy,jsp,jstl,annotations
Web应用程序需要这些模块才能拥有JSP页面。
$ java -jar $JETTY_HOME/start.jar
服务器已启动。
现在我们将创建一个简单的Web应用程序。
$ cd .. $ mkdir first $ cd first $ mkdir -p src/web/WEB-INF $ touch src/web/index.jsp $ touch build.xml
我们创建一个欢迎页面index.jsp和ANT build.xml文件。
<!DOCTYPE html> <html> <body> <p> Today's date: <%= (new java.util.Date()).toLocaleString()%> </p> </body> </html>
index.jsp页面以本地化格式打印当前日期。
<?xml version="1.0"?>
<project name="First" default="archive">
<property name="name" value="first"/>
<property name="dist.dir" location="dist"/>
<property name="web.dir" location="src/web"/>
<property name="jetty.base" location="/home/janbodnar/prog/jetty/my-base"/>
<property name="deploy.path" location="${jetty.base}/webapps"/>
<target name="init">
<mkdir dir="${dist.dir}"/>
</target>
<target name="archive" depends="init">
<war destfile="${dist.dir}/${name}.war" needxmlfile="false">
<fileset dir="${web.dir}"/>
</war>
<echo>Archive created</echo>
</target>
<target name="deploy" depends="archive">
<copy file="${dist.dir}/${name}.war" overwrite="true"
todir="${deploy.path}"/>
<echo>Archive deployed</echo>
</target>
<target name="clean" depends="init">
<delete dir="${dist.dir}"/>
<echo>Cleaning completed</echo>
</target>
</project>
这个Ant构建文件包含用于创建构建目录和分发目录以及清理(删除)它们的任务。它创建一个Web存档(WAR文件),其中包含单个index.jsp文件。deploy任务将WAR文件部署到Jetty base的webapps目录。
$ ant deploy
Buildfile: /home/janbodnar/prog/jetty/first/build.xml
init:
archive:
[echo] Archive created
deploy:
[copy] Copying 1 file to /home/janbodnar/prog/jetty/my-base/webapps
[echo] Archive deployed
BUILD SUCCESSFUL
Total time: 0 seconds
我们使用deploy任务运行Ant。创建并部署了一个Web存档。
$ curl localhost:8080/first/ <!DOCTYPE html> <html> <body> <p> Today's date: Sep 16, 2014 10:43:45 AM </p> </body> </html>
Web应用程序的上下文由存档文件名决定:first.war。该应用程序成功返回当前日期。
我们为Jetty base启用了JSP模块,但我们没有显式配置JSP页面的使用(例如在web.xml文件中)。通过启用deploy模块,包含了一个默认配置。
$ 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
${jetty.home}/etc/jetty-plus.xml
${jetty.home}/etc/jetty-annotations.xml
--list-config选项列出将用于启动Jetty的配置。在输出的末尾,我们有服务器加载的XML文件。每个模块都会加载一个XML文件。jetty-deploy.xml就是其中之一。
<Set name="defaultsDescriptor"><Property name="jetty.home"
default="." />/etc/webdefault.xml</Set>
jetty-deploy.xml有这行加载webdefault.xml配置文件,其中包含JSP页面的配置。
<servlet id="jsp"> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> ... </servlet>
这是webdefault.xml文件中配置JSP页面支持的摘录。
来源
本教程使用了Jetty官方的参考指南。
本章是Jetty的介绍。
作者
列出所有Java教程。