jetty必知必会

星火照天明 星火照天明     2022-08-23     585

关键词:

导语

如果是开发老鸟,请阅读快速入门,这已经足够。如果是新手,请阅读全文,这里有你想要的热部署,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 git@git.lianjia.com: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 $@

 

架构实践架构师必知必会的5种业界主流的架构风格

 【架构实践】架构师必知必会的5种业界主流的架构风格目录 【架构实践】架构师必知必会的5种业界主流的架构风格 查看详情

架构实践架构师必知必会的5种业界主流的架构风格

 【架构实践】架构师必知必会的5种业界主流的架构风格目录 【架构实践】架构师必知必会的5种业界主流的架构风格 查看详情

正则表达式必知必会读书笔记

架构图模拟小案例1.匹配美元 查看详情

tcp/ip,必知必会的

...TCP拥塞控制 0前言本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养。 1TCP/IP模型TCP/IP协议模型(TransmissionControlProtocol/InternetProtocol 查看详情

必知必会

1什么是MySQL   MySQL是一个关系型数据库管理系统,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。在J... 查看详情

必知必会的设计原则——合成复用原则(代码片段)

 设计原则系列文章 必知必会的设计原则——单一职责原则必知必会的设计原则——开放封闭原则必知必会的设计原则——依赖倒置原则必知必会的设计原则——里氏替换原则必知必会的设计原则——接口隔离原则必知必... 查看详情

hive必知必会(代码片段)

hive: 基于hadoop,数据仓库软件,用作OLAPOLAP:onlineanalyzeprocess 在线分析处理OLTP:onlinetransactionprocess在线事务处理 事务: ACID A:atomic 原子性 C:consistent 一致性 I:isolation 隔离性 D:durability 持久性 1读未提交   脏读 //事务... 查看详情

mysql必知必会(代码片段)

姊妹篇——Hive必知必会(数据仓库):https://hiszm.blog.csdn.net/article/details/119907136文章目录第一章:数据库基础基本概念什么是SQL第二章:MySQL简介第三章:了解数据库和表第四章:检索数据SELECT语句第五章:... 查看详情

crypto必知必会(代码片段)

crypto必知必会最近参加了个ctf比赛,在i春秋,南邮方面刷了一些crypto密码学题目,从中也增长了不少知识,在此关于常见的密码学知识做个小总结!Base编码Base编码中用的比较多的是base64,首先就说一下Base64编码方式将字符串以... 查看详情

01《正则表达式必知必会》(已看)(仅存放)

【01】《正则表达式必知必会》  共149页。扫描版,中文版。SamsTeachYourselefRegularExpressionsin10minutesBenForta著。杨涛翻译 【】魔芋:这本书已经没有用了。内容已吸收。 内容较为基础,也很全面。  **附件列表&... 查看详情

《正则表达式必知必会》读书笔记

《正则表达式必知必会》读书笔记 *正则表达式入门1.正则表达式的两种基本用途:搜索和替换。2.正则表达式是一些用来匹配和处理文本的字符串。小结:正则表达式是文本处理方面功能最强大的工具之一,正则表达式语言... 查看详情

h5系列之history(必知必会)(代码片段)

H5系列之History(必知必会)目录概念兼容性属性方法H5方法概念理解HistoryApi的使用方式目的是为了解决哪些问题作用:ajax获取数据时,可以改变历史记录,从而可以使用浏览器的后退和前进。【】规范地址:http://www.w3.org/TR/html5... 查看详情

hadoop必知必会——重要部分整理

上一篇的传送门:Hadoop必知必会——重要部分整理(一)一、HDFS在读文件时,如果一个块突然坏了客户端读取完DataNode上的块之后会进行checksum验证,就是把客户端读取到本地的块与HDFS上的原始块进行校验ÿ... 查看详情

springmvc--必知必会(代码片段)

  SpringMVC基于模型--视图--控制器(Model-View-Controller,MVC)模式实现,属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无需实现任何接口。同时它还支持... 查看详情

rhce通关必知必会

考前一:更改虚机root密码?在开机启动出现内核选项时按e,进入启动编辑模式;?光标定位到以linux16开头的这一行,按下键盘上的[End]键,直接跳到这一行的末尾,追加rd.break;?按Ctrl+x重启进入单用户模式;?mount-oremount,rw/sysroot?chroot... 查看详情

scala必知必会(代码片段)

文章目录入门概述安装JavaVSScalaval和var基本数据类型lazy在Scala中的应用开发工具IDEAMaven函数方法定义默认参数命名参数可变参数条件语句循环语句面向对象概述类的定义和使用抽象类伴生类和伴生对象case和trait集合数组ListSetMapOpt... 查看详情

customview必知必会——问题清单

目录第1章(绘图基础)一、基本图形绘制二、路径三、文字四、Region五、Canvas(画布)六、控件的使用方法第2章(视图动画)一、视图动画标签二、视图动画的代码实现三、插值器初探四、动画示例五、逐帧动画第... 查看详情

iptables必知必会用法

防火墙iptables包过滤型防火墙防火墙的类别:代理服务器(proxy):代理client访问internet,分割内部与外部网络IPFilter:进入本机的tcp/ip封装协议进行过滤软件防火墙(逻辑上实现)    硬件防火墙(硬件配合软件实现)ipt... 查看详情