在jetty中部署应用有多种方法。
我们来先看一个web应用的解剖图
/WEB-INF/
存放和应用相关的servlet api目录,这里不存放公共访问的web应用内容,对于在应用之间内部使用,又不想在浏览器中直接访问的内容,可以直接放在这里,例如配置文件
/WEB-INF/web.xml
这个文件必需,用来定义web应用行为
/WEB-INF/classes/
存放web应用相关java class文件
/WEB-INF/lib/
存放第三方jar文件
Jetty web应用优先从/WEB-INF/classes目录装载class文件,然后再从/WEB-INF/lib中的jar文件中
Web应用自动部署
我们把war文件或者把war解压成目录,放到{jetty.home}/webapps目录下,jetty 部署扫描器就会找到它并依照上下文路径进行部署。
部署上下文路径对应有以下关系:
文件或目录名称 | 分配上下文路径 |
/webapps/footrope.war | http://host/footrope/ |
/webapps/baggywrinkle-1.0.war | http://host/baggywrinkle-1.0/ |
/webapps/lazaret-2.1.3-SNAPSHOT.war | http://host/lazaret-2.1.3-SNAPSHOT/ |
/webapps/belaying-pins/WEB-INF/web.xml | http://host/belaying-pins/ |
/webapps/root.war (special name) | |
/webapps/root/WEB-INF/web.xml (special name) | http://host/ |
Web应用定制配置
有的时候,你不想让上下文路径就是文件的名称,或者你想使用特殊的数据库连接池,尽快使用自动部署方便简单。
我们需要使用Jetty 部署描述配置文件来完成。
Jetty支持通过XML文件创建ContextHandler实例来完成部署。
下面是一个最简单的jetty部署的XML配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!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">/wiki</Set>
<Set name="war">/opt/myapp/myapp.war</Set>
</Configure>
我们看到两个属性需要配置,分别是contextPath和war
如果war的路径经常变更,还可以使用SystemProperty元素,假设SystemProperty设置为myapp.home=/opt/myapp
那么上面的配置文件可以修改为
<?xml version=”1.0” encoding=”UTF-8”?>
<!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">/wiki</Set>
<Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>
</Configure>
如果需要添加初始化参数,那么在这里也是可以添加,不过对于唯一的命名参数,在web.xml中存在是会覆盖这里设置的参数值。
<?xml version=”1.0” encoding=”UTF-8”?>
<!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">/wiki</Set>
<Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>
<Get name="ServletContext">
<Call name="setInitParameter">
<Arg>myapp.config</Arg>
<Arg><SystemProperty name="myapp.home">/config/app-config.xml</Arg>
</Call>
</Get>
</Configure>
如果想要覆盖web.xml配置文件中的参数,而又不破坏war文件,可以使用如下配置方法。
<?xml version="1.0" encoding="UTF-8"?>
<!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">/wiki</Set>
<Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>
<Set name="overrideDescriptor">/opt/myapp/overlay-web.xml</Set>
</Configure>
最后,也最有用的一种配置方法,添加数据库连接池,如果在web.xml中没有配置,可以使用如下配置方法。
<?xml version="1.0" encoding="UTF-8"?>
<!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">/wiki</Set>
<Set name="war"><SystemProperty name="myapp.home"/>/myapp.war</Set>
<New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/DSTest</Arg>
<Arg>
<New class="org.apache.commons.dbcp.BasicDataSource">
<Set name="driverClassName">org.some.Driver</Set>
<Set name="url">jdbc.url</Set>
<Set name="username">jdbc.user</Set>
<Set name="password">jdbc.pass</Set>
</New>
</Arg>
</New>
</Configure>