jetty 9 嵌入式开发示例
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 嵌入式开发示例的更多相关文章
- Jetty 开发指南:嵌入式开发示例
Jetty具有嵌入各种应用程序的丰富历史. 在本节中,我们将向您介绍我们的git存储库中的embedded-jetty-examples项目下的一些简单示例. 重要:生成此文档时,将直接从我们的git ...
- Jetty 9嵌入式开发
官方网址:http://www.eclipse.org/jetty/ 下载地址:http://download.eclipse.org/jetty/stable-9/dist/ 文档网址:http:/ ...
- jetty之嵌入式开发
一.Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可 ...
- Java使用Jetty实现嵌入式Web服务器及Servlet容器
Jetty是一个Java实现的开源的servlet容器,它既可以像Tomcat一样作为一个完整的Web服务器和Servlet容器,同时也可以嵌入在Java应用程序中,在Java程序中调用Jetty. ...
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...
- 【嵌入式开发】裸机引导操作系统和ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )
[嵌入式开发]ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 ) 一. 内存 ...
- 嵌入式开发—C语言面试题
嵌入式开发—C语言面试题 源地址:http://blog.csdn.net/xdx2ct1314/article/details/7358929 1. 用预处理指令#define 声明一个常数,用 ...
- JavaScript可以做嵌入式开发了
JS怎么可能搞嵌入式开发? TESSEL这个工具可直接在设备上运行JS,无需服务端支持. 百闻不如一见,请查看官网介绍吧:http://technical.io/ 网页内还有一个示例,点击会看到LED ...
- 嵌入式开发中常见3个的C语言技巧
Hey,大家好!我是CrazyCatJack.今天我来说几个在嵌入式开发中常用的C语言技巧吧.也许你曾经用过,也许你只是见到过但是没有深入理解.那么今天好好补充下吧^_^ 1.指向函数的指针 指针不光 ...
随机推荐
- cessss
[文字] 关注1啊啊啊啊啊 点击关注微信 点击关注微信2 点击关注微信3 关注2啊啊啊啊啊啊啊啊啊啊啊 关注3啊啊啊啊啊啊啊啊 关注4啊啊啊啊啊啊啊啊 关注5啊啊啊啊啊啊啊啊 关注6啊啊啊啊啊啊啊啊啊 ...
- 回收ImageView占用的图像内存
使用方法: RecycleBitmap.recycleImageView(mSelectorView); 参数为imageview /** * 回收ImageView占用的图像内存; * 使用了本 ...
- [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event
[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...
- php 7.0 安装以及老版本php删除
一, 安装php7 php7对php5是99%的兼容, 而且性能更好, 网上很多的优秀的库都对版本有一定的要求, 所以推荐安装php7 低于ubuntu 16.04的系统默认的源不带php7, 所以需 ...
- Android开发的小技巧,在Android Studio中使用Designtime Layout Attributes
在编写xml文件时,为了预览效果,经常会使用默认填上一些内容,比如TextView时,随便写上一个text <TextView ... android:text="Name:" ...
- iOS9请求https问题-记录
iOS9 开始苹果将HTTP全改为HTTPS了,所以出现网络请求失败问题,解决办法: 1.改回HTTP: 在info.plist文件中添加一个Key:NSAppTransportSecurity(字典 ...
- 安卓学习----使用okHttp(POST方式)---登录
工具类 package com.liunan.okhttpdemo3post.Utils; import java.io.IOException; import okhttp3.MediaType; ...
- Java中 实现多线程成的三种方式(继承,实现,匿名内部类)
---------------------------------------------------------------------------------------------------- ...
- yii2缓存的介绍和使用
作者:白狼 出处:http://www.manks.top/yii2_cache.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律 ...
- Reporting Service 服务启动时报错The service did not respond to the start or control request in a timely fashion
案例环境: 启动一台数据库服务器(Windows Server 2003)的Reporting Service(SQL Server 2008 R2)服务时,出现如下错误信息: System.Inva ...