嵌入式服务器jetty,让你更快开发web

概述

jetty是什么?

jetty是轻量级的web服务器和servlet引擎。

它的最大特点是:可以很方便的作为嵌入式服务器

它是eclipse的一个开源项目。不用怀疑,就是你常用的那个eclipse。

它是使用Java开发的,所以天然对Java支持良好。

官方网址

github源码地址

什么是嵌入式服务器?

以jetty来说明,就是只要引入jetty的jar包,可以通过直接调用其API的方式来启动web服务。

用过Tomcat、Resin等服务器的朋友想必不会陌生那一套安装、配置、部署的流程吧,还是挺繁琐的。使用jetty,就不需要这些过程了。

jetty非常适用于项目的开发、测试,因为非常快捷。如果想用于生产环境,则需要谨慎考虑,它不一定能像成熟的Tomcat、Resin等服务器一样支持企业级Java EE的需要。

jetty的嵌入式启动

我觉得嵌入式启动方式的一个好处在于:可以直接运行项目,无需每次部署都得再配置服务器。

jetty的嵌入式启动使用有两种方式:

API方式

maven插件方式

API方式

添加maven依赖

<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>

官方的启动代码

public class SplitFileServer
{
    public static void main( String[] args ) throws Exception
    {
        // 创建Server对象,并绑定端口
        Server server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(8090);
        server.setConnectors(new Connector[] { connector });

        // 创建上下文句柄,绑定上下文路径。这样启动后的url就会是:http://host:port/context
        ResourceHandler rh0 = new ResourceHandler();
        ContextHandler context0 = new ContextHandler();
        context0.setContextPath("/");
      
        // 绑定测试资源目录(在本例的配置目录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);

        // 绑定两个资源句柄
        ContextHandlerCollection contexts = new ContextHandlerCollection();
        contexts.setHandlers(new Handler[] { context0, context1 });
        server.setHandler(contexts);

        // 启动
        server.start();

        // 打印dump时的信息
        System.out.println(server.dump());

        // join当前线程
        server.join();
    }
}

直接运行Main方法,就可以启动web服务。

注:以上代码在eclipse中运行没有问题,如果想在Intellij中运行还需要为它指定配置文件。

如果想了解在Eclipse和Intellij都能运行的通用方法可以参考我的github代码示例。

我的实现也是参考springside的方式。

代码行数有点多,不在这里贴代码了。

完整参考代码

Maven插件方式

如果你熟悉maven,那么实在太简单了

注: Maven版本必须在3.3及以上版本。

(1) 添加maven插件

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>9.3.12.v20160915</version>
</plugin>

(2) 执行maven命令:

mvn jetty:run

讲真,就是这么简单。jetty默认会为你创建一个web服务,地址为127.0.0.1:8080。

当然,你也可以在插件中配置你的webapp环境

<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>

参考

jetty wiki

jetty官方文档

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SDNLAB

OpenDaylight Lithium-SR2 Cluster集群搭建

目的 希望大家能够通过本教程对OpenDaylight集群的基本概念如shard/基本配置有所了解,感受OpenDaylight的High Availabili...

2915
来自专栏晓晨的专栏

如何高效的编写与同步博客 (.NET Core 小工具实现)

1181
来自专栏Python与爬虫

佛系编程[如何创建一个安全可靠的应用程序]

推荐最近在GitHub上很火的一个项目,按照介绍,你也可以创建一个安全可靠的应用程序 项目地址在>>> nocode https://github.com/k...

3639
来自专栏加米谷大数据

MongoDB 安装和可视化工具

MongoDB 是一款非常热门的NoSQL,面向文档的数据库管理系统,我选择的是 Enterprise Server (MongoDB 3.2.9)版本,安装在...

891
来自专栏后端技术探索

初识nginx基础篇-日志管理和切割

Nginx日志主要分为两种,访问日志和错误日志。两种日志可以在http和server模块中配置,nginx有一个非常灵活的日志记录模式。每个级别的...

732
来自专栏向治洪

Intellij IDEA 插件开发之自建插件仓库

Intellij IDEA 有一个自己的官方的插件仓库,但是当我们的开发的 Intellij IDEA 的插件不能够对外公开时,我们就需要搭建自己的 Intel...

3545
来自专栏木子墨的前端日常

React Native 基础报错及解决方案记录

刚开始上手RN,碰到很多坑,记录一下。碰到问题多去看看github上面的issue!

683
来自专栏张戈的专栏

【ES私房菜】收集 Apache 访问日志

在上一篇系列文章《【ES私房菜】收集 Linuix 系统日志》我们已经完成了Linux系统日志上报ES这个简单的试运行项目,我们现在对数据收集、处理以及上报等流...

3800
来自专栏Felix的技术分享

用Android Studio调试Framework层代码

1955
来自专栏运维小白

19.12 添加自定义监控项目

添加自定义监控项目 需求:监控某台web的80端口连接数,并出图 两步:1)zabbix监控中心创建监控项目;2)针对该监控项目以图形展现 对于第一步,需要到客...

1878

扫码关注云+社区