jetty 9 嵌入应用程序后,小型的web应用直接打成一个单独的jar包,就可以直接运行,非常适合做Demo演示或云端集群部署。

主要代码:

JettyServer的封装类

 package yjmyzz.jetty.demo.server;

 import org.eclipse.jetty.server.*;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.RequestLogHandler;
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.util.thread.ThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.LoggerFactory; import java.io.File; public class JettyWebServer { private static org.slf4j.Logger logger = LoggerFactory.getLogger(JettyWebServer.class); private Server server;
private int port;
private String host;
private String tempDir;
private String logDir;
private String webDir;
private String contextPath; public JettyWebServer(int port, String host, String tempDir, String webDir, String logDir, String contextPath) { logger.info("port:{},host:{},tempDir:{},webDir:{},logDir:{},contextPath:{}", port, host, tempDir, webDir, logDir, contextPath); this.port = port;
this.host = host;
this.tempDir = tempDir;
this.webDir = webDir;
this.contextPath = contextPath;
this.logDir = logDir;
} public void start() throws Exception {
server = new Server(createThreadPool());
server.addConnector(createConnector());
server.setHandler(createHandlers());
server.setStopAtShutdown(true);
server.start();
} public void join() throws InterruptedException {
server.join();
} private ThreadPool createThreadPool() {
QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setMinThreads(10);
threadPool.setMaxThreads(100);
return threadPool;
} private NetworkConnector createConnector() {
ServerConnector connector = new ServerConnector(server);
connector.setPort(port);
connector.setHost(host);
return connector;
} private HandlerCollection createHandlers() {
WebAppContext context = new WebAppContext();
context.setContextPath(contextPath);
context.setWar(webDir);
context.setTempDirectory(new File(tempDir)); RequestLogHandler logHandler = new RequestLogHandler();
logHandler.setRequestLog(createRequestLog());
GzipHandler gzipHandler = new GzipHandler();
HandlerCollection handlerCollection = new HandlerCollection();
handlerCollection.setHandlers(new Handler[]{context, logHandler, gzipHandler});
return handlerCollection;
} private RequestLog createRequestLog() {
//记录访问日志的处理
NCSARequestLog requestLog = new NCSARequestLog();
requestLog.setFilename(logDir + "/yyyy-mm-dd.log");
requestLog.setRetainDays(90);
requestLog.setExtended(false);
requestLog.setAppend(true);
//requestLog.setLogTimeZone("GMT");
requestLog.setLogTimeZone("Asia/Shanghai");
requestLog.setLogDateFormat("yyyy-MM-dd HH:mm:ss SSS");
requestLog.setLogLatency(true);
return requestLog;
} }

启动代码示例:

 package yjmyzz.jetty.demo.main;

 import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import yjmyzz.jetty.demo.server.JettyWebServer;
import yjmyzz.jetty.demo.util.FileUtil;
import yjmyzz.jetty.demo.util.JarUtils; import java.util.HashMap;
import java.util.Map; public class JettyApp { private static final String PORT = "port";
private static final String WEB_DIR = "web";
private static final String LOG_DIR = "log";
private static final String TEMP_DIR = "temp";
private static final String CONTEXT_PATH = "context";
private static final String HOST = "host";
private static final Map<String, String> param = new HashMap<>();
private static Logger logger = LoggerFactory.getLogger(JettyWebServer.class); public static void main(String... anArgs) throws Exception { if (anArgs.length == 0) {
param.put(PORT, "8080");
param.put(WEB_DIR, "web");
param.put(LOG_DIR, "logs");
param.put(TEMP_DIR, "temp");
param.put(CONTEXT_PATH, "/demo");
param.put(HOST, "localhost");
} for (String arg : anArgs) {
System.out.println(arg);
if (!StringUtils.isEmpty(arg) && arg.contains("=")) {
String[] t = arg.trim().split("=");
param.put(t[0], t[1]);
}
} initParam(); unzipSelf(); new JettyApp().start();
} private static void initParam() { String logDir = FileUtil.currentWorkDir + param.get(LOG_DIR);
String tempDir = FileUtil.currentWorkDir + param.get(TEMP_DIR);
String webDir = FileUtil.currentWorkDir + param.get(WEB_DIR); logger.debug(logDir);
logger.debug(tempDir);
logger.debug(webDir); String temp = "x.x";//占位
FileUtil.createDirs(logDir + "/" + temp);
FileUtil.createDirs(tempDir + "/" + temp);
FileUtil.createDirs(webDir + "/" + temp); param.put(LOG_DIR, logDir);
param.put(TEMP_DIR, tempDir);
param.put(WEB_DIR, webDir);
} private JettyWebServer server; public JettyApp() {
server = new JettyWebServer(
Integer.parseInt(param.get(PORT).toString()),
param.get(HOST),
param.get(TEMP_DIR),
param.get(WEB_DIR),
param.get(LOG_DIR),
param.get(CONTEXT_PATH));
} public void start() throws Exception {
server.start();
server.join();
} private static void unzipSelf() {
//将jar自身解压 String selfPath = FileUtil.getJarExecPath(JettyApp.class);
if (selfPath.endsWith(".jar")) {
// 运行环境
try {
logger.info("正在将\n" + selfPath + "\n解压至\n" + param.get(WEB_DIR));
JarUtils.unJar(selfPath, param.get(WEB_DIR));
} catch (Exception e) {
logger.error("解压web内容失败!", e);
}
} else {
// IDE环境
param.put(WEB_DIR, selfPath);
}
logger.info(selfPath);
}
}

我在github上开源了一个jetty9 + spring mvc4 + velocity2的示例项目,地址:https://github.com/yjmyzz/jetty-embed-demo

jetty 9 嵌入式开发示例的更多相关文章

  1. Jetty 开发指南:嵌入式开发示例

    Jetty具有嵌入各种应用程序的丰富历史. 在本节中,我们将向您介绍我们的git存储库中的embedded-jetty-examples项目下的一些简单示例. 重要:生成此文档时,将直接从我们的git ...

  2. Jetty 9嵌入式开发

    官方网址:http://www.eclipse.org/jetty/ 下载地址:http://download.eclipse.org/jetty/stable-9/dist/ 文档网址:http:/ ...

  3. jetty之嵌入式开发

    一.Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可 ...

  4. Java使用Jetty实现嵌入式Web服务器及Servlet容器

     Jetty是一个Java实现的开源的servlet容器,它既可以像Tomcat一样作为一个完整的Web服务器和Servlet容器,同时也可以嵌入在Java应用程序中,在Java程序中调用Jetty. ...

  5. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...

  6. 【嵌入式开发】裸机引导操作系统和ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )

    [嵌入式开发]ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )     一. 内存 ...

  7. 嵌入式开发—C语言面试题

    嵌入式开发—C语言面试题 源地址:http://blog.csdn.net/xdx2ct1314/article/details/7358929   1. 用预处理指令#define 声明一个常数,用 ...

  8. JavaScript可以做嵌入式开发了

    JS怎么可能搞嵌入式开发? TESSEL这个工具可直接在设备上运行JS,无需服务端支持. 百闻不如一见,请查看官网介绍吧:http://technical.io/ 网页内还有一个示例,点击会看到LED ...

  9. 嵌入式开发中常见3个的C语言技巧

    Hey,大家好!我是CrazyCatJack.今天我来说几个在嵌入式开发中常用的C语言技巧吧.也许你曾经用过,也许你只是见到过但是没有深入理解.那么今天好好补充下吧^_^ 1.指向函数的指针 指针不光 ...

随机推荐

  1. xp操作系统下配置iis,出现了server application error的解决办法

    在网上搜索了很多解决办法,最后发现一个差不多的: Server Application Error The server has encountered an error while loading ...

  2. Linux系统NFS网络文件系统

    Linux系统NFS网络文件系统 NFS(network file system)网络文件系统,就是通过网络让不同的主机系统之间可以共享文件或目录,此种方法NFS客户端使用挂载的方式让共享文件或目录到 ...

  3. iOS之APP应用图标的设置

    图标是IOS程序包所必需的组成部分.如果你没有提供程序所需的各种尺寸的图标,程序上传发布时可能会无法通过验证.IOS程序为兼顾不同的应用场景,定义了多个不同规格的图标,并以不同的命名区分: IOS图标 ...

  4. android滚动公告栏

    项目里要用到开奖公告,单行显示向上滚动的TextView,网上随便找了一个控件发现效果还不错改装一下就可以用到项目里.唯一不妥的地方就是字体大小不太好控制,不是正常的字体大小,也没有深究代码,先把工作 ...

  5. Vs2013 html5开发WP8.1 APP之jquery

    仿安卓原生界面,先使用JQM,最新的JQM使用了JQ1.8.5 然后在WP8以上就会遇到动态创建控件的安全性问题 换成JQ2.X即可,但在WP8.1中一定不要删除了 <script src=&q ...

  6. [转]oracle 实施方法论学习心得

      本周由部门新入职的同事为我们分享oracle实施方法论,本次重点围绕项目启动会来做介绍,并着重介绍了oracle与我们不一样的地方.收获颇丰,简单总结几个值得学习借鉴的要点: 1.      细节 ...

  7. Linux SendMail服务启动慢总结

    在 CentOS release 6.6 上启动sendmail服务时发现服务启动过程非常慢,基本上要耗费3分多钟.有点纳闷:什么原因导致sendmail启动这么慢?搜索了这方面的一些资料,结合自己的 ...

  8. 使用memadmin可视化监视我们的memcache

    相信还是有很多项目使用memcache,可能有些人说有点out了,但是呢??? 项目上的东西不是你想换就能换的...谁都想多一事不如少 一事,大面积更换之后所面临的未知风险可能让你无法承受,但是呢, ...

  9. MYSQL服务器my.cnf配置文档详解

    MYSQL服务器my.cnf配置文档详解 硬件:内存16G [client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-re ...

  10. Java之TreeMap

    基本特性: 基于红黑树. 非线程安全. 同步使用: SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...))