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. Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系

    Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...

  2. 装配bean

    spring有三种装配bean的方式:隐式装配.java代码装配.xml装配 隐式装配最为省事方便,也称为自动化装配 这三种装配方式可以混搭着来用 在这里通过一个例子来讲述配置 CD的两个实现,一个是 ...

  3. Jsp静态包含和动态包含的区别

    1 <%@include file="xxx.jsp"%>为jsp中的编译指令,其文件的包含是发生在jsp向servlet转换的时期,而<jsp:include ...

  4. qq空间返回顶部代码

    点击这里体验效果 以下是源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  5. sharepoint2013爬xls文件:Error initializing IFilter for extension的解决方案

    最近sharepoint2013爬网出现: error initializing IFilter for extension '.xls' (Error code is 0x80030002). Th ...

  6. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q109-Q111)

    Question  109  Your company uses a third-party service to host its SharePoint 2010 site. The hosting ...

  7. iOS多线程之2.NSThread的加锁@synchronized

    我在上一篇文章讲了线程的生命周期,这篇文章来讲讲线程加锁的注意事项与@synchronized关键字.   那什么时候需要加锁呢,就是当多条线程同时操作一个变量时,就需要加锁了.至于为什么要加锁,可以 ...

  8. 学习Maven之Properties Maven Plugin

    1.properties-maven-plugin是个什么鬼? 介绍前我们先看一个问题,比如我们有一个maven项目结构如下: 一般我们都把一些配置文件放到像src/main/resources/jd ...

  9. TeamCity实战(1):准备工作

    环境: Windows Server 2008 R2 SP1(不会再有SP2,参考这里:http://www.techspot.com/news/50599-microsoft-wont-releas ...

  10. 【转载】latch: cache buffers chains

    本文转自惜分飞的博客,博客原文地址:www.xifenfei.com/1109.html,支持原创,分享知识! 当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们 ...