一.配置简单的嵌入式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")
}
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();
        }
    }
}
其中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")
}
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();
    }
}
appStart方法内第3-5行是为了支持servlet3特性.其中上面的setWar这里就是上面打包的war包路径.
c.运行一下main方法,就可以通过浏览器来访问这个web应用了.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
# demoWeb 一个基于SpringMVC的web框架 1.0.5 从web项目迁移成maven项目 1.0.6 增加菜单框架ext实现,类路径调整 1.0.7 增加http工具类,demo例子 1.0.8 socket工具类,权限组件,菜单组件,jdbc分页支持多种数据库,ant路径工具类,增加jquery easyUI 1.0.9 版本管理,服务根路径工具类,文件上传工具类 1.0.10 集成ueditor在线编辑器 1.0.11 地址联动 1.0.12 Excel工具类 Word工具类 Java NIO实现socket工具类 分布式session jdk升级到1.7 嵌入式redis服务(只支持linux) 1.0.13 修改默认的beanName生成策略,controller参数扩展 1.0.14 分布式session使用zookeeper 1.0.15 zookeeper工具类优化 增加工具类 1.0.16 页面html标志修改 httpclient中文支持 工具类增强(zip,reflect,thread) 1.0.17 ftp服务端和客户端工具类,配置文件maven和web项目路径统一 1.1.0 soapui工具类(web版本) properties等工具类 1.1.1 工具类数据校验 jsp自定义标签 Spring自定义注解 默认requestMapping 1.1.2 代码生成器 1.1.3 首页修改 dateformat.js 时间参数转换 SpringMVC配置文件集中 快递参数接口 1.1.4 des加解密字符串和文件 1.1.5 redis 加锁,redis升级成2.8.2 freemarker工具类 1.1.6 spring websocket 实现在线聊天 maven升级jdk1.8 jetty9.2.4 web升级jdk1.7 tomcat7 1.1.7(maven only) 包名修改 从此不再支持web版本,只支持maven版本 1.1.8 jquery 图片预览插件 图片滚动显示插件 1.1.9 jquery实现鼠标在按钮上显示窗口,离开窗口和按钮时消失 1.1.10 rabbitMQ集成 视频截图 图片缩略图旋转 集成Mybatis 使用数据库连接池druid dubbo使用 1.1.11 集成Spring Cache,FastJson Spring Cache增加redis缓存实现 Mybatis使用二级缓存,增加redis实现 增加reactJs 增加Mybatis插件pageHelper,Mapper 1.1.12 使用draft富文本编辑器 增加ant design 代码生成器功能增强

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值