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. 使用MyEclipse中servlet对SQL Server 2008的CRUD

    1.在MyEclipse下建立Web Project,找到根目录建立Database文件夹和Doc文件夹,Database用于保存数据库信息,Doc用于保存数据库表信息. 2.打开SQL Server ...

  2. [Architecture] 系统架构正交分解法

    [Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大 ...

  3. jQuery拖拽改变元素大小

    一个非常简单的例子,体验效果:http://keleyi.com/keleyi/phtml/jqtexiao/29.htm 以下是完整代码,保存到HTML文件打开也可以体验效果. <!DOCTY ...

  4. 1-1 node 基础

    1.什么是nodejs?   简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js ...

  5. C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能

    先不说如何实现,先来看看效果图: 读取远程的需要提供下远程的计算用户名和密码即可. 如何实现这个代码功能,请看如下代码部分: 实体类: using System; using System.Colle ...

  6. Android—ZXing二维码扫描遇到的问题

    最近工作中需要开发带有二维码扫描功能的软件(基于开源项目ZXing),遇到的问题记录一下,也希望给大家带来帮助. 1.首先因为扫描要开摄像机所以加权限是一定的,不然后面什么都不能进行 <uses ...

  7. cocos2dx骨骼动画Armature源码分析(二)

    flash中数据与xml中数据关系 上篇博文从总体上介绍了cocos2dx自带的骨骼动画,这篇介绍一下导出的配置数据各个字段的含义(也解释了DragonBone导出的xml数据每个字段的含义). sk ...

  8. ORACLE等待事件: log file parallel write

    log file parallel write概念介绍 log file parallel write 事件是LGWR进程专属的等待事件,发生在LGWR将日志缓冲区(log_buffer)中的重做日志 ...

  9. goldengate abended with no data found

    先来看下报错ggserr.log: 2016-12-22 04:48:52  WARNING OGG-02544  Unhandled error (ORA-26787: The row with k ...

  10. 《java JDK7 学习笔记》之异常处理

    1.java中所有的错误都会被打包为对象,JVM会尝试执行try区块中的程序代码,如果发生错误,执行流程会跳离错误发生点,然后比较catch括号中声明的异常类型,是否符合被抛出的错误对象类型,如果是的 ...