首页 > 代码库 > jetty 必知必会

jetty 必知必会

导语

如果是开发老鸟,请阅读快速入门,这已经足够。如果是新手,请阅读全文,这里有你想要的热部署,debug 配置等内容,能够提高开发效率,避免浪费时间。

简介

jetty 是一个应用服务器,类似于 tomcat、resin,但是更轻量,尤其在开发时更为适合。项目地址:http://www.eclipse.org/jetty/

快速入门

在我们的 maven 项目中,引入 jetty 插件,就可以简单的以一行命令启动服务,命令如下

mvn clean package -Djetty.port=8100 jetty:run

一目了然,监听服务端口是 8100。使用 jetty 插件启动我们的服务,需要如下配置。

  1. 在 web 项目的 pom.xml 中加入 jetty 的 plugin。
    <plugins>    .....    <plugin>      <groupId>org.eclipse.jetty</groupId>      <artifactId>jetty-maven-plugin</artifactId>      <version>[latest stable version]</version>   </plugin></plugins>
  2. 在项目类路径下加入  jetty-contexts.xml。加入这个文件是为了使 jetty 启动变快,过滤掉不必要的扫描。因为在 jetty8 后启动时会扫描所有的 jar 包,来查找符合 Servlet3 特征的文件。

    <?xml version="1.0"?><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"><Configure class="org.eclipse.jetty.webapp.WebAppContext">    <Call name="setAttribute">        <Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>        <Arg>.*/.*jsp-api-[^/]\.jar$|./.*jsp-[^/]\.jar$|./.*taglibs[^/]*\.jar$        </Arg>    </Call></Configure>
  3. 在 jetty plugin 中加入 jetty-contexts.xml。最终配置如下
    <plugins>    .....    <plugin>      <groupId>org.eclipse.jetty</groupId>      <artifactId>jetty-maven-plugin</artifactId>      <version>[latest stable version]</version>      <configuration>        <contextXml>src/main/resources/jetty-contexts.xml</contextXml>      </configuration>   </plugin></plugins>

     

热部署

当上面配置完成后,尚未配置动态部署,具体实现操作如下

  1. 设置 IDE,将其设置为自动编译。eclipse 默认即是自动编译,idea 需要设置,如下
    技术分享
  2. 将启动命令增加设置,如下
    mvn clean package -Djetty.port=8100 -Djetty.reload=automatic -Djetty.scanIntervalSeconds=2 jetty:run
  3. 设置 JVM 参数,增大 max perm size。在重新加载时,使用默认 JVM 设置会出现方法区出现 out of memory error, perm size 字样。
    -XX:PermSize=512M -XX:MaxPermSize=512M

现在,使用步骤2 的 mvn 命令,即可实现热部署,便利的进行开发了。

断点调试

这里以 idea 为例介绍,eclipse 下使用类似,使用 idea 的好处请自行 google。

  1. 新建启动配置。在菜单栏 -> RUN -> edit configurations... 下,点击左上角的 “+” 符号,添加 maven configuration。这里起名 crm。
    技术分享
  2. 设置 run debug。在菜单栏 -> RUN -> edit configurations... 下,将热部署 2 中的命令粘贴到 command line 中(注:去掉 maven),如下
    技术分享
  3. 同样设置 JVM 参数,打开 Runner 页签,设置 VM OPTIONS,如下
    技术分享

至此,既可以断点调试设置完毕,进入菜单栏 -> Run -> Debug ‘crm’,点击即启动断点调试。

示例

请参考 crm 项目的 run.sh 脚本,如下

 1 #!/bin/bash 2 # 1. `sh run.sh all dev` 拉取 fe 的 dev 分支代码,启动项目. 3 # 2. `sh run.sh all` 拉取 fe 的默认分支 `master`,启动项目. 4 # 3. `sh run.sh` 保持原 fe 分支代码,启动项目. 5   6 pullFeCode(){ 7     # pull newest fe code 8     echo "lianjia-fe/crm newest code pulled to fe/ directory" 9  10     if [ ! -d fe ];then11         mkdir fe12     fi13  14     cd fe15  16     if [ ! -d crm ];then17         git clone git@git.lianjia.com:lianjia-fe/crm.git18     fi19  20     cd crm && git pull && git checkout $FE_CRM_BRANCH && git pull origin $FE_CRM_BRANCH21  22     # remove old files23     cd ../../src/main/webapp && rm -rf asset deps template index.html24  25     # build new files26     cd ../../../fe/crm && sh build.sh "./" "../../src/main/webapp/"27 }28  29 startJetty(){30     cd $PROJECT_BASE;31     export MAVEN_OPTS="-Xms2048m -Xmx2048m -XX:PermSize=512M -XX:MaxPermSize=512M -Dfile.encoding=UTF-8"32     mvn clean package -Djetty.port=8100 jetty:run33 }34  35 printUsage(){36     echo "USAGE: sh run.sh [all] [branch]";37     echo "-- all 表示拉取分支, branch 表示前端分支, 使用示例:";38     echo "  1. ‘sh run.sh all dev‘ 拉取 fe 的 dev 分支代码,启动项目.";39     echo "  2. ‘sh run.sh all‘ 拉取 fe 的默认分支 ‘master‘,启动项目.";40     echo "  3. ‘sh run.sh‘ 保持原 fe 分支代码,启动项目.";41 }42  43 Main(){44  45     PROJECT_BASE=`pwd`;46  47     #当前的前端分支48     FE_CRM_BRANCH="master";49  50     # 强制杀死所有已经启动的 Jetty51     jps|grep Launcher|awk {system("kill -9 "$1)}52  53     # 参数不能多于两个54     if [ $# -gt 2 ]; then55         echo "ERROR: 参数不能超过两个 !";56         printUsage57         exit;58     fi59  60     # 有参数则第一个参数必须为 all61     if ([ $# -ne 0 ] && [ $1 != "all" ]); then62         echo "ERROR: 第一个参数必须为 ‘all‘ !";63         printUsage64         exit;65     fi66  67     # 当没有参数时,直接编译 Java 代码,启动 Jetty68     if [ $# -eq 0 ]; then69         startJetty;70         exit;71     fi72  73     FE_CRM_BRANCH=$2;74     echo "前端分支切换到 $FE_CRM_BRANCH";75  76     # 当参数为 all 时,拉取最新前端分支代码,编译 Java 代码,启动 jetty77     pullFeCode && startJetty;78 }79  80 Main $@

 

jetty 必知必会