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 ];then
11         mkdir fe
12     fi
13
14     cd fe
15
16     if [ ! -d crm ];then
17         git clone [email protected]:lianjia-fe/crm.git
18     fi
19
20     cd crm && git pull && git checkout $FE_CRM_BRANCH && git pull origin $FE_CRM_BRANCH
21
22     # remove old files
23     cd ../../src/main/webapp && rm -rf asset deps template index.html
24
25     # build new files
26     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:run
33 }
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     # 强制杀死所有已经启动的 Jetty
51     jps|grep Launcher|awk ‘{system("kill -9 "$1)}‘
52
53     # 参数不能多于两个
54     if [ $# -gt 2 ]; then
55         echo "ERROR: 参数不能超过两个 !";
56         printUsage
57         exit;
58     fi
59
60     # 有参数则第一个参数必须为 all
61     if ([ $# -ne 0 ] && [ $1 != "all" ]); then
62         echo "ERROR: 第一个参数必须为 ‘all‘ !";
63         printUsage
64         exit;
65     fi
66
67     # 当没有参数时,直接编译 Java 代码,启动 Jetty
68     if [ $# -eq 0 ]; then
69         startJetty;
70         exit;
71     fi
72
73     FE_CRM_BRANCH=$2;
74     echo "前端分支切换到 $FE_CRM_BRANCH";
75
76     # 当参数为 all 时,拉取最新前端分支代码,编译 Java 代码,启动 jetty
77     pullFeCode && startJetty;
78 }
79
80 Main [email protected]
时间: 2024-10-24 04:37:47

jetty 必知必会的相关文章

MySQL必知必会 学习笔记(一)

第一章  了解SQL 模式:   关于数据库和表的布局以及特性的信息.[描述表可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)]. 第二章 MySQL简介 MySQL是一种DBMS,即它是一种数据库软件.基于客户机----服务器的数据库. MySQL工具: 1.mysql 命令行实用程序 2.MySQL Administrator 3.MySQL query Browser 第四章 检索数据 LIMIT 5 表示MySQL返

mysql 必知必会总结

以前 mysql 用的不是很多, 2 天看了一遍 mysql 必知必会又复习了一下基础.  200 页的书,很快就能看完, 大部分知识比较基础, 但还是了解了一些以前不知道的知识点.自己做一个备份,随时查看. 命令:sql 不区分大小写,语句大写,列.表名小写是一种习惯连接命令:mysql -u user_name –h example.mysql.alibabalabs.com –P3306 –pxxxxquithelp show; // 查看所有 show 命令show databases;

JSON必知必会学习总结(一)

七月第一周,从学校毕业回来上班的第一周.离开一段时候后,再次回来重新工作,有了很多新的认识,不再是实习时那么混混沌沌了.每天我自己该做什么,怎么做,做到什么程度更清晰了.除了要去完成我负责的工作,我开始去想除了完成工作我要从中获得什么. 今天早晨走的时候,随手塞包里一本薄薄的书--<JSON必知必会>,白天间隙的时候看了前两章,这两章设计的内容平时基本接触过,但是没有系统的总结过,看完之后清晰了很多. 首先,JSON是什么,这本书是说JSON是一种数据交换格式,被许多系统用于数据交换. 数据交

SQLServer:《SQL必知必会》一书的读书笔记(五)

第5课 高级数据过滤 5.1 组合 WHERE 子句 第4课介绍的 WHERE 子句在过滤数据时都是用单一的条件. 5.1.1 AND 操作符 检索由供应商 DLL01 制造且价格小于等于 4 美元的所有产品的名称和价格: SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4; 5.1.2 OR 操作符 检索任一个指定供应商制造的所有产品的名称和价格: SEL

.NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一些列是使用.NET/C#来展现,但是同样适用于其他类似的OO技术平台,这些技术点可能称不上完整的技术,但是它是经验的总结,是掉过多少坑之后的觉醒,所以有必要花几分钟时间记住它,在真实的项目开发中你就知道是多么的有帮助.好了,废话不说了,进入主题. 我们在开发服务时为了调试方便会在本地进行一个基本的模块测试,你也可以认为是集

《MySQL必知必会》读书笔记_4

PS:一个实际的存储过程案例 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_article_by_id`(IN `id` int) BEGIN #Routine body goes here... DECLARE temp INT; SET @aid = id; SELECT COUNT(*) FROM gk_reply_article WHERE a_id = @aid INTO temp; IF(temp <> 0) THEN

移动前端开发人员必知必会:移动设备概述

因为工作岗位的变换带来工作内容的变动,对于移动网站的前端开发已经疏远了好几个月,在这好几个月中有很多新的东西出现,自己所掌握的一些东西也已经陈旧,所以选择了这本书<HTML5触摸界面设计与开发>来系统地学习和整理一下关于移动网站前端开发的知识体系. 之所以选择这本书,一是因为这本书比较新,2014年04月发的第一版.其二是因为作者Stephen Woods,这是Flickr团队的资深前端,Yahoo主页的Javascript技术平台正是出自此人之手. 接下来的时间里会陆续上传关于这本书学习的一

mysql学习--mysql必知必会1

?? 例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式处理. (.)是正則表達式的一个符号,表示匹配随意一个字符: mysql> select prod_name -> from products -> where prod_name regexp '.000' -> order by prod_name; +--------------

《MySQL 必知必会》读书总结

这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. ? ? 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter password:****** 显示数据库 mysql>SHOW DATABASES; 选择数据库 mysql>USE mytest; 显示数据库中的表 mysql>SHOW TABLES; 显示表列 mysql>SHOW COLUMNS FROM tmall_user; mysql

rime 必知必會

https://github.com/rime/home/wiki/CustomizationGuide Rime 定製指南 必知必會 建議您在定製 Rime 輸入法之前瞭解 Rime 輸入方案的概念.Rime 中的數據文件分佈及作用等基礎知識. 必知必會 重新佈署的操作方法 [中州韻]點擊輸入法狀態欄上的 ? (Deploy) 按鈕 或:如果找不到狀態欄,在終端輸入以下命令,可觸發自動部署: rm ~/.config/ibus/rime/default.yaml; ibus-daemon -d