概述
jetty是什么防泵?
jetty是輕量級(jí)的web服務(wù)器和servlet引擎窟勃。
它的最大特點(diǎn)是:可以很方便的作為嵌入式服務(wù)器春霍。
它是eclipse的一個(gè)開(kāi)源項(xiàng)目。不用懷疑指攒,就是你常用的那個(gè)eclipse慷妙。
它是使用Java開(kāi)發(fā)的,所以天然對(duì)Java支持良好允悦。
什么是嵌入式服務(wù)器膝擂?
以jetty來(lái)說(shuō)明,就是只要引入jetty的jar包,可以通過(guò)直接調(diào)用其API的方式來(lái)啟動(dòng)web服務(wù)架馋。
用過(guò)Tomcat狞山、Resin等服務(wù)器的朋友想必不會(huì)陌生那一套安裝、配置叉寂、部署的流程吧萍启,還是挺繁瑣的。使用jetty屏鳍,就不需要這些過(guò)程了勘纯。
jetty非常適用于項(xiàng)目的開(kāi)發(fā)、測(cè)試钓瞭,因?yàn)榉浅驳遵?旖荨H绻胗糜谏a(chǎn)環(huán)境山涡,則需要謹(jǐn)慎考慮堤结,它不一定能像成熟的Tomcat、Resin等服務(wù)器一樣支持企業(yè)級(jí)Java EE的需要佳鳖。
jetty的嵌入式啟動(dòng)
我覺(jué)得嵌入式啟動(dòng)方式的一個(gè)好處在于:可以直接運(yùn)行項(xiàng)目,無(wú)需每次部署都得再配置服務(wù)器媒惕。
jetty的嵌入式啟動(dòng)使用有兩種方式:
API方式
maven插件方式
API方式
添加maven依賴(lài)
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.3.2.v20150730</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-annotations</artifactId>
<version>9.3.2.v20150730</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>9.3.2.v20150730</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jstl</artifactId>
<version>9.3.2.v20150730</version>
<scope>test</scope>
</dependency>
官方的啟動(dòng)代碼
public class SplitFileServer
{
public static void main( String[] args ) throws Exception
{
// 創(chuàng)建Server對(duì)象系吩,并綁定端口
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(8090);
server.setConnectors(new Connector[] { connector });
// 創(chuàng)建上下文句柄,綁定上下文路徑妒蔚。這樣啟動(dòng)后的url就會(huì)是:http://host:port/context
ResourceHandler rh0 = new ResourceHandler();
ContextHandler context0 = new ContextHandler();
context0.setContextPath("/");
// 綁定測(cè)試資源目錄(在本例的配置目錄dir0的路徑是src/test/resources/dir0)
File dir0 = MavenTestingUtils.getTestResourceDir("dir0");
context0.setBaseResource(Resource.newResource(dir0));
context0.setHandler(rh0);
// 和上面的例子一樣
ResourceHandler rh1 = new ResourceHandler();
ContextHandler context1 = new ContextHandler();
context1.setContextPath("/");
File dir1 = MavenTestingUtils.getTestResourceDir("dir1");
context1.setBaseResource(Resource.newResource(dir1));
context1.setHandler(rh1);
// 綁定兩個(gè)資源句柄
ContextHandlerCollection contexts = new ContextHandlerCollection();
contexts.setHandlers(new Handler[] { context0, context1 });
server.setHandler(contexts);
// 啟動(dòng)
server.start();
// 打印dump時(shí)的信息
System.out.println(server.dump());
// join當(dāng)前線程
server.join();
}
}
直接運(yùn)行Main方法穿挨,就可以啟動(dòng)web服務(wù)。
注:以上代碼在eclipse中運(yùn)行沒(méi)有問(wèn)題肴盏,如果想在Intellij中運(yùn)行還需要為它指定配置文件科盛。
如果想了解在Eclipse和Intellij都能運(yùn)行的通用方法可以參考我的github代碼示例。
我的實(shí)現(xiàn)也是參考springside的方式菜皂。
代碼行數(shù)有點(diǎn)多贞绵,不在這里貼代碼了。
Maven插件方式
如果你熟悉maven恍飘,那么實(shí)在太簡(jiǎn)單了
注: Maven版本必須在3.3及以上版本榨崩。
(1) 添加maven插件
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.12.v20160915</version>
</plugin>
(2) 執(zhí)行maven命令:
mvn jetty:run
講真,就是這么簡(jiǎn)單章母。jetty默認(rèn)會(huì)為你創(chuàng)建一個(gè)web服務(wù)母蛛,地址為127.0.0.1:8080。
當(dāng)然乳怎,你也可以在插件中配置你的webapp環(huán)境
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.12.v20160915</version>
<configuration>
<webAppSourceDirectory>${project.basedir}/src/staticfiles</webAppSourceDirectory>
<!-- 配置webapp -->
<webApp>
<contextPath>/</contextPath>
<descriptor>${project.basedir}/src/over/here/web.xml</descriptor>
<jettyEnvXml>${project.basedir}/src/over/here/jetty-env.xml</jettyEnvXml>
</webApp>
<!-- 配置classes -->
<classesDirectory>${project.basedir}/somewhere/else</classesDirectory>
<scanClassesPattern>
<excludes>
<exclude>**/Foo.class</exclude>
</excludes>
</scanClassesPattern>
<scanTargets>
<scanTarget>src/mydir</scanTarget>
<scanTarget>src/myfile.txt</scanTarget>
</scanTargets>
<!-- 掃描target目錄下的資源文件 -->
<scanTargetPatterns>
<scanTargetPattern>
<directory>src/other-resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<excludes>
<exclude>**/myspecial.xml</exclude>
<exclude>**/myspecial.properties</exclude>
</excludes>
</scanTargetPattern>
</scanTargetPatterns>
</configuration>
</plugin>
官方給的jetty-env.xml范例
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<!-- Add an EnvEntry only valid for this webapp -->
<New id="gargle" class="org.eclipse.jetty.plus.jndi.EnvEntry">
<Arg>gargle</Arg>
<Arg type="java.lang.Double">100</Arg>
<Arg type="boolean">true</Arg>
</New>
<!-- Add an override for a global EnvEntry -->
<New id="wiggle" class="org.eclipse.jetty.plus.jndi.EnvEntry">
<Arg>wiggle</Arg>
<Arg type="java.lang.Double">55.0</Arg>
<Arg type="boolean">true</Arg>
</New>
<!-- an XADataSource -->
<New id="mydatasource99" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jdbc/mydatasource99</Arg>
<Arg>
<New class="com.atomikos.jdbc.SimpleDataSourceBean">
<Set name="xaDataSourceClassName">org.apache.derby.jdbc.EmbeddedXADataSource</Set>
<Set name="xaDataSourceProperties">databaseName=testdb99;createDatabase=create</Set>
<Set name="UniqueResourceName">mydatasource99</Set>
</New>
</Arg>
</New>
</Configure>