一.配置简单的嵌入式tomcat和jetty
我们写了一个web应用,打成war包后,就需要找一个server来部署.对于我们的实际应用,我们基本没必要自己再写一个嵌入式的server.接下来两篇文章只是以钻研的心态来学习一下嵌入式tomcat和jetty. 促使我去写这篇文章是因为在我看来,gretty不完美,无论用tomcat还是jetty,修改类之后,reload几次内存占用高涨,硬盘读写频繁,最终感到无奈(应用存在内存不正确释放,或许我使用的方式不对).
我选用了<<gradle的war插件>>简单开发的web应用,此例主要开发框架:springmvc(java config方式)+spring data jpa(jpa由hibernate实现)+mysql,开发IDE工具:idea13.1,项目管理工具:gradle,源码下载:http://download.csdn.net/detail/xiejx618/7696821 一.war包配置的嵌入式tomcat例子. 1.运行一下war任务,对这个web应用打成war包.然后再解压一下这个包.
2.再新建一个gradle项目
a.build.gradle
- apply plugin: 'java'
- sourceCompatibility = 1.6
- version = '1.0'
- repositories {
- mavenCentral()
- }
- dependencies {
- compile("org.apache.tomcat.embed:tomcat-embed-jasper:8.0.9")
- compile("org.apache.tomcat.embed:tomcat-embed-core:8.0.9")
- compile("org.apache.tomcat.embed:tomcat-embed-logging-juli:8.0.9")
- compile("org.apache.tomcat.embed:tomcat-embed-logging-log4j:8.0.9")
- compile("org.apache.tomcat.embed:tomcat-embed-el:8.0.9")
- compile("org.apache.tomcat.embed:tomcat-embed-websocket:8.0.9")
- compile("org.eclipse.jdt.core.compiler:ecj:4.4")
- }
apply plugin: 'java'
sourceCompatibility = 1.6
version = '1.0'
repositories {
mavenCentral()
}
dependencies {
compile("org.apache.tomcat.embed:tomcat-embed-jasper:8.0.9")
compile("org.apache.tomcat.embed:tomcat-embed-core:8.0.9")
compile("org.apache.tomcat.embed:tomcat-embed-logging-juli:8.0.9")
compile("org.apache.tomcat.embed:tomcat-embed-logging-log4j:8.0.9")
compile("org.apache.tomcat.embed:tomcat-embed-el:8.0.9")
compile("org.apache.tomcat.embed:tomcat-embed-websocket:8.0.9")
compile("org.eclipse.jdt.core.compiler:ecj:4.4")
}
compile("org.eclipse.jdt.core.compiler:ecj:4.4")相当重要,没有此jar包,类加载器就没有加载部分类的字节码,我多次调试才找到问题. 当然,也可以建一个java工程,到http://tomcat.apache.org/download-80.cgi下载Binary Distributions的Embedded包(下载地址:http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.9/bin/embed/apache-tomcat-8.0.9-embed.zip),把里面的所有jar包加到工程的Libraries就可以了. b.新建一个含有main方法的可执行类(此类的编写参考了Aleksa Vukotic James Goodwill写的<<Apache Tomcat 7>>CHAPTER9 Embedding Tomcat).
- import org.apache.catalina.LifecycleException;
- import org.apache.catalina.core.AprLifecycleListener;
- import org.apache.catalina.core.StandardServer;
- import org.apache.catalina.startup.ClassLoaderFactory;
- import org.apache.catalina.startup.Tomcat;
- import javax.servlet.ServletException;
- /**
- * Created by nil on 2014/8/1.
- */
- public class EmbeddedTomcat {
- private Tomcat tomcat;
- private void startTomcat(int port,String contextPath,String baseDir) throws ServletException, LifecycleException {
- tomcat = new Tomcat();
- tomcat.setPort(port);
- tomcat.setBaseDir(".");
- StandardServer server = (StandardServer) tomcat.getServer();
- AprLifecycleListener listener = new AprLifecycleListener();
- server.addLifecycleListener(listener);
- tomcat.addWebapp(contextPath, baseDir);
- tomcat.start();
- }
- private void stopTomcat() throws LifecycleException {
- tomcat.stop();
- }
- public static void main(String[] args) {
- try {
- int port=8080;
- String contextPath = "/test";
- String baseDir = "C:/Users/nil/AppData/Local/Temp/jetty-0.0.0.0-8080-test-1.0.war-_test-any-8966644989981380511.dir/webapp";
- EmbeddedTomcat tomcat = new EmbeddedTomcat();
- tomcat.startTomcat(port, contextPath, baseDir);
- //由于Tomcat的start方法为非阻塞方法,加一个线程睡眠模拟线程阻塞.
- Thread.sleep(10000000);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
import org.apache.catalina.LifecycleException;
import org.apache.catalina.core.AprLifecycleListener;
import org.apache.catalina.core.StandardServer;
import org.apache.catalina.startup.ClassLoaderFactory;
import org.apache.catalina.startup.Tomcat;
import javax.servlet.ServletException;
/**
* Created by nil on 2014/8/1.
*/
public class EmbeddedTomcat {
private Tomcat tomcat;
private void startTomcat(int port,String contextPath,String baseDir) throws ServletException, LifecycleException {
tomcat = new Tomcat();
tomcat.setPort(port);
tomcat.setBaseDir(".");
StandardServer server = (StandardServer) tomcat.getServer();
AprLifecycleListener listener = new AprLifecycleListener();
server.addLifecycleListener(listener);
tomcat.addWebapp(contextPath, baseDir);
tomcat.start();
}
private void stopTomcat() throws LifecycleException {
tomcat.stop();
}
public static void main(String[] args) {
try {
int port=8080;
String contextPath = "/test";
String baseDir = "C:/Users/nil/AppData/Local/Temp/jetty-0.0.0.0-8080-test-1.0.war-_test-any-8966644989981380511.dir/webapp";
EmbeddedTomcat tomcat = new EmbeddedTomcat();
tomcat.startTomcat(port, contextPath, baseDir);
//由于Tomcat的start方法为非阻塞方法,加一个线程睡眠模拟线程阻塞.
Thread.sleep(10000000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
其中baseDir为前面war解压的路径,另两个参数port和contextPath是容易理解的. c.运行一下main方法,就可以通过浏览器来访问这个web应用了.
二.war包配置的嵌入式jetty例子. 1.运行一下war任务,对这个web应用打成war包. 2.再新建一个gradle项目. a.build.gradle
- apply plugin: 'java'
- sourceCompatibility = 1.6
- version = '1.0'
- repositories {
- mavenCentral()
- }
- dependencies {
- compile("org.eclipse.jetty:example-jetty-embedded:9.2.1.v20140609")
- compile("org.eclipse.jetty:jetty-jsp:9.2.1.v20140609")
- }
apply plugin: 'java'
sourceCompatibility = 1.6
version = '1.0'
repositories {
mavenCentral()
}
dependencies {
compile("org.eclipse.jetty:example-jetty-embedded:9.2.1.v20140609")
compile("org.eclipse.jetty:jetty-jsp:9.2.1.v20140609")
}
b.新建一个含有main方法的可执行类(此类的编写主要参考jetty官方文档:http://www.eclipse.org/jetty/documentation/current/using-annotations-embedded.html).
- import org.eclipse.jetty.server.Server;
- import org.eclipse.jetty.webapp.*;
- /**
- * Created by nil on 2014/8/2.
- */
- public class Main {
- //Create a WebApp
- private static WebAppContext getWebAppContext(){
- WebAppContext webapp = new WebAppContext();
- webapp.setContextPath("/");
- webapp.setWar("E:/idea/test/build/libs/test-1.0.war");
- return webapp;
- }
- public static void appStart() throws Exception {
- Server server = new Server(8080);
- //Enable parsing of jndi-related parts of web.xml and jetty-env.xml
- org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server);
- classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration");
- classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration");
- //get a WebAppContext
- server.setHandler(getWebAppContext());
- server.start();
- server.join();
- }
- public static void main(String[] args) throws Exception {
- appStart();
- }
- }
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.*;
/**
* Created by nil on 2014/8/2.
*/
public class Main {
//Create a WebApp
private static WebAppContext getWebAppContext(){
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setWar("E:/idea/test/build/libs/test-1.0.war");
return webapp;
}
public static void appStart() throws Exception {
Server server = new Server(8080);
//Enable parsing of jndi-related parts of web.xml and jetty-env.xml
org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration");
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration");
//get a WebAppContext
server.setHandler(getWebAppContext());
server.start();
server.join();
}
public static void main(String[] args) throws Exception {
appStart();
}
}
appStart方法内第3-5行是为了支持servlet3特性.其中上面的setWar这里就是上面打包的war包路径. c.运行一下main方法,就可以通过浏览器来访问这个web应用了.
一.配置简单的嵌入式tomcat和jetty的更多相关文章
- IntelliJ IDEA使用(二):tomcat和jetty配置
上一讲用idea创建了maven web项目,接下来我们把项目发布到tomcat和jetty运行,以便进一步地开发和调试 配置tomcat 第一.打开菜单栏 第二.点击设置按钮,添加应用服务器,选择t ...
- IntelliJ IDEA使用(二):tomcat和jetty配置(转自:http://www.cnblogs.com/jenkinschan/p/6052948.html)
上一讲用idea创建了maven web项目,接下来我们把项目发布到tomcat和jetty运行,以便进一步地开发和调试 配置tomcat 第一.打开菜单栏 第二.点击设置按钮,添加应用服务器,选择t ...
- Maven配置tomcat和jetty插件来运行项目
针对eclipse中的Run on Server有些情况下并不是那么好操作,比如配置maven下的springmvc插件,如果使用此方法运行会很容易出现组件缺少导致错误出现一大堆的问题. 那么针对这种 ...
- Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP、CMS-WordPress&Ghost、Jenkins、Gitlab)
Web服务和应用是目前信息技术领域的热门技术.如何使用Docker来运行常见的Web服务器(包括Apache.Nginx.Tomcat等),以及一些常用应用(LAMP.CMS等).包括具体的镜像构建方 ...
- idea/eclipse下Maven工程集成web服务(tomcat、jetty)
idea/eclipse下Maven工程集成web服务 转载请注明出处:http://www.cnblogs.com/funnyzpc/p/8093554.html 应用服务器最常用的一般有这哥仨: ...
- Tomcat学习总结(7)——Tomcat与Jetty比较
Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理 ...
- tomcat与jetty的区别
转载自:https://www.cnblogs.com/fengli9998/p/7247559.html Jetty和Tomcat为目前全球范围内最著名的两款开源的webserver/servlet ...
- (转)Tomcat与Jetty区别
一.简介 Tomcat: Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共 ...
- Spring Boot 嵌入式 Tomcat 文件上传、url 映射虚拟路径
1.Java web 应用开发完成后如果是导入外置的 Tomcat 的 webapps 目录的话,那么上传的文件可以直接的放在应用的 web 目录下去就好了,浏览器可以很方便的进行访问. 2.Spri ...
随机推荐
- Bootstrap4 导航栏元素居右
Bootstrap 4正解: .ml-auto元素居右 .mr-auto元素居左 在某度上查了半小时还是没查出什么名堂,搜出来的方法大多都是Bootstrap3的,实测pull-right或navba ...
- URAL - 1146
从来不会DP的家伙终于要开始重拾DP了 最大子矩阵没啥好说的,注意单调最大子矩阵不用这么高复杂度,另行更新 #include<bits/stdc++.h> #define rep(i,j, ...
- Python获取当前时间及格式化
1.导入time模块 # 导入time模块 import time 2.打印时间戳-time.time() # 导入time模块 import time # 打印时间戳 print(time.time ...
- Java面试题搜集
这里是一些Java面试题,从"程序员小灰"公众号转载过来,备用. 项目介绍 明确项目是做什么的 明确项目的价值.(为什么做这个项目,它解决了用户什么痛点,它带来什么价值?) 明确项 ...
- c#输入方法名来调用方法(反射)
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...
- 机器学习——GBDT
基础概念 GBDT(Gradient Boosting Decision Tree) 全称梯度提升决策树,是一种迭代的决策树算法.GBDT是集成学习Boosting的家族成员,GBDT中的树是回归树, ...
- git使用方法记录
git是一个分布式的代码版本管理系统,使用起来的确很方便,已签只会star别人的项目,今天刚好有空抽点时间学了一下,简单的几个命令的用法. 首先在giuhub上可以托管代码,然后可以将远程仓库拖到本地 ...
- springboot整合rabbitmq,支持消息确认机制
安装 推荐一篇博客https://blog.csdn.net/zhuzhezhuzhe1/article/details/80464291 项目结构 POM.XML <?xml version= ...
- bzoj 4771: 七彩树
Description 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有 ...
- 很有用的PHP笔试题系列三
1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2. SESSION 与 COOKIE的区别是什么,请从 ...