第3章. Jetty配置介绍
如何配置jetty
要明白jetty的配置,你需要先明白“如何做”和“怎么做”,这一节介绍如何配置jetty在什么样的机制下去执行配置,下一节介绍你如何配置这些机制。
jetty POJO配置
jetty的核心组件是简单传统的JAVA对象(POJO),配置jetty的过程其实就是实例化对象的过程。
- 编写JAVA代码直接实例化装配到jetty对象,这被称为嵌入jetty。
- 使用XML配置,这种是控制反转(Ioc)框架,在XML中实例化和装配jetty对象。etc/jetty.xml是主的Jetty XML配置文件,但也很多其他的etc/feature.xml 文件包含在jetty中。
- 使用第三方的Ioc框架,像Spring,实例化和装配jetty对象到Spring bean.
因为jetty配置文件是通过Ioc完成的,Jetty API文档是最标准的配置参考。
Jetty启动配置文件
Jetty通过以下配置文件实例化,通过start.jar注射和启动服务器。
ini files
jetty启动采用命令行的方式。 $JETTY_BASE/start.ini 或 $JETTY_BASE/start.d/*.ini 文件去创建有效参数的命令行。参数可能是:
- 在jetty Ioc(或spring)XML格式中的XML文件。
- 模块激活形式 --module=name
- 属性的格式 name=value,用参数表示Jetty Ioc XML
- 一个标准的JAVA属性文件包含附加的启动属性。
- 其他的start.jar选项(参见java -jar start.jar --help)
- 一些JVM选项
ini文件位于jetty的安装地址(如果jetty home不同),通过编辑去更改配置(例如,修改端口)。
mod文件
$JETTY_HOME/modules/*.mod文件包含模块的定义,可以通过- -module=name激活使用,每个模块文件的定义如下:
- 订购和激活模块依赖关系
- 模块所需要的库添加到classpath。
- 模块所需要的XML文件添加到有效的命令行。
- 通过激活模块所需要的文件。
- 用—add-to-start=name选项激活时,要使用模板ini文件。
通常模块文件很少编辑,只有重大的结构性变化才会修改。*.mod文件通常放在$JETTY_HOME/modules/,但是额外的和编辑过的模块可能在$JETTY_BASE/module。如果需要模块改动,最好在修改之前,从$JETTY_HOME/modules/复制到$JETTY_BASE/modules/目录,在修改。
XML files
Jetty IoC XML格式或spring IoC格式的XML文件有2种,在ini文件或通过模块定义增加命令行。XML文件和Java对象组成了服务器,连接器和环境。因为Jetty IoC XML文件使用属性,最常见的配置可以在不修改这些XML文件来完成,而是可以通过编辑相应的ini文件属性来实现。
这些XML文件通常位于 $JETTY_HOME/etc/,额外或编辑的XML文件可以添加到 $JETTY_BASE/etc/.如果配置需要改变,最好先从$JETTY_HOME/etc/ 复制到 $JETTY_BASE/etc/,在进行修改。
web.xml
Servlet规范定义了定义和配置Web应用程序使用的过滤器,servlet和资源web.xml部署描述符。Jetty WebAppContext组件使用这种XML格式:
- web应用上下文的默认配置。
- 解释在WEB-INF/web.xml文件的web应用程序所提供的特定的配置。
- 解释描述符代码段,包含Jar文件中的WEB-INF/lib的META-INF目录。
Property Files
标准的Java属性文件也用于jetty配置
- 通过使用属性元素的jetty IoC XML的参数。
- 要配置默认的日志记录机制(StdErrLog),你也可以引入其他日志记录框架,并且还可以使用属性文件。(例如,log4j)
- 作为一个简单的数据库登录用户名和凭据。
Jetty IoC XML format
要明白Jetty Ioc XML的格式,下面是一个嵌入式的jetty服务器和配置在Java里的例子。package org.eclipse.jetty.embedded; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.servlet.ServletContextHandler; public class ExampleServer { public static void main(String[] args) throws Exception { Server server = new Server(); ServerConnector connector = new ServerConnector(server); connector.setPort(8080); server.setConnectors(new Connector[] { connector }); ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/"); context.addServlet(HelloServlet.class, "/hello"); context.addServlet(AsyncEchoServlet.class, "/echo/*"); HandlerCollection handlers = new HandlerCollection(); handlers.setHandlers(new Handler[] { context, new DefaultHandler() }); server.setHandler(handlers); server.start(); server.join(); } }Jetty ioc XML格式允许你在XML中实例化和配置完全相同的服务器,而无需编写任何Java代码:
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_9_3.dtd"> <Configure id="ExampleServer" class="org.eclipse.jetty.server.Server"> <Set name="connectors"> <Array type="org.eclipse.jetty.server.Connector"> <Item> <New class="org.eclipse.jetty.server.ServerConnector"> <Arg><Ref refid="ExampleServer"/></Arg> <Set name="port">8080</Set> </New> </Item> </Array> </Set> <New id="context" class="org.eclipse.jetty.servlet.ServletContextHandler"> <Set name="contextPath">/hello</Set> <Call name="addServlet"> <Arg>org.eclipse.jetty.embedded.HelloServlet</Arg> <Arg>/</Arg> </Call> </New> <Set name="handler"> <New class="org.eclipse.jetty.server.handler.HandlerCollection"> <Set name="handlers"> <Array type="org.eclipse.jetty.server.Handler"> <Item> <Ref refid="context" /> </Item> <Item> <New class="org.eclipse.jetty.server.handler.DefaultHandler" /> </Item> </Array> </Set> </New> </Set> </Configure>
在实践中,最常用的是在etc目录中的标准XML文件,因此,配置jetty通常只需要修改存在的XML文件和修改它们注入的属性值。