一.配置简单的嵌入式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

[plain] view plain copy print?

  1. apply plugin: ‘java‘
  2. sourceCompatibility = 1.6
  3. version = ‘1.0‘
  4. repositories {
  5. mavenCentral()
  6. }
  7. dependencies {
  8. compile("org.apache.tomcat.embed:tomcat-embed-jasper:8.0.9")
  9. compile("org.apache.tomcat.embed:tomcat-embed-core:8.0.9")
  10. compile("org.apache.tomcat.embed:tomcat-embed-logging-juli:8.0.9")
  11. compile("org.apache.tomcat.embed:tomcat-embed-logging-log4j:8.0.9")
  12. compile("org.apache.tomcat.embed:tomcat-embed-el:8.0.9")
  13. compile("org.apache.tomcat.embed:tomcat-embed-websocket:8.0.9")
  14. compile("org.eclipse.jdt.core.compiler:ecj:4.4")
  15. }
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).

[java] view plain copy print?

  1. import org.apache.catalina.LifecycleException;
  2. import org.apache.catalina.core.AprLifecycleListener;
  3. import org.apache.catalina.core.StandardServer;
  4. import org.apache.catalina.startup.ClassLoaderFactory;
  5. import org.apache.catalina.startup.Tomcat;
  6. import javax.servlet.ServletException;
  7. /**
  8. * Created by nil on 2014/8/1.
  9. */
  10. public class EmbeddedTomcat {
  11. private Tomcat tomcat;
  12. private void startTomcat(int port,String contextPath,String baseDir) throws ServletException, LifecycleException {
  13. tomcat = new Tomcat();
  14. tomcat.setPort(port);
  15. tomcat.setBaseDir(".");
  16. StandardServer server = (StandardServer) tomcat.getServer();
  17. AprLifecycleListener listener = new AprLifecycleListener();
  18. server.addLifecycleListener(listener);
  19. tomcat.addWebapp(contextPath, baseDir);
  20. tomcat.start();
  21. }
  22. private void stopTomcat() throws LifecycleException {
  23. tomcat.stop();
  24. }
  25. public static void main(String[] args) {
  26. try {
  27. int port=8080;
  28. String contextPath = "/test";
  29. String baseDir = "C:/Users/nil/AppData/Local/Temp/jetty-0.0.0.0-8080-test-1.0.war-_test-any-8966644989981380511.dir/webapp";
  30. EmbeddedTomcat tomcat = new EmbeddedTomcat();
  31. tomcat.startTomcat(port, contextPath, baseDir);
  32. //由于Tomcat的start方法为非阻塞方法,加一个线程睡眠模拟线程阻塞.
  33. Thread.sleep(10000000);
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
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

[plain] view plain copy print?

  1. apply plugin: ‘java‘
  2. sourceCompatibility = 1.6
  3. version = ‘1.0‘
  4. repositories {
  5. mavenCentral()
  6. }
  7. dependencies {
  8. compile("org.eclipse.jetty:example-jetty-embedded:9.2.1.v20140609")
  9. compile("org.eclipse.jetty:jetty-jsp:9.2.1.v20140609")
  10. }
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).

[java] view plain copy print?

  1. import org.eclipse.jetty.server.Server;
  2. import org.eclipse.jetty.webapp.*;
  3. /**
  4. * Created by nil on 2014/8/2.
  5. */
  6. public class Main {
  7. //Create a WebApp
  8. private static WebAppContext getWebAppContext(){
  9. WebAppContext webapp = new WebAppContext();
  10. webapp.setContextPath("/");
  11. webapp.setWar("E:/idea/test/build/libs/test-1.0.war");
  12. return webapp;
  13. }
  14. public static void appStart() throws Exception {
  15. Server server = new Server(8080);
  16. //Enable parsing of jndi-related parts of web.xml and jetty-env.xml
  17. org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server);
  18. classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration");
  19. classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration");
  20. //get a WebAppContext
  21. server.setHandler(getWebAppContext());
  22. server.start();
  23. server.join();
  24. }
  25. public static void main(String[] args) throws Exception {
  26. appStart();
  27. }
  28. }
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应用了.

原文地址:https://www.cnblogs.com/firstdream/p/8309302.html

时间: 2024-10-22 13:45:20

一.配置简单的嵌入式tomcat和jetty的相关文章

IntelliJ IDEA使用(二):tomcat和jetty配置

上一讲用idea创建了maven web项目,接下来我们把项目发布到tomcat和jetty运行,以便进一步地开发和调试 配置tomcat 第一.打开菜单栏 第二.点击设置按钮,添加应用服务器,选择tomcat server 选择tomcat目录 添加后如下所示 到此我们已经把tomcat服务器添加进idea了,接下来还得设置maven web项目的部署信息 第三.设置部署文件 ctrl + shift + alt + s 快捷键打开Project Structure 设置Modules: 检查

Maven tomcat和jetty的配置插件

pom.xml中的插件tomcat或jetty的配置 <plugins> <!--tomcat插件 --> <!-- 启动:tomcat7:run 停止需强制退出,点停止按钮或ctrl+c,使用maven的tomcat7:shutdown并不能关闭. path 和port指明了访问的url端口和地址,若想path指向项目名:则可以使用来${project.build.finalName}来引用项目名 访问主页的路径 :http://localhost:9999/ -->

Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP)

Web服务和应用是目前信息技术领域的热门技术.如何使用Docker来运行常见的Web服务器(包括Apache.Nginx.Tomcat等),以及一些常用应用(LAMP.CMS等).包括具体的镜像构建方法与使用步骤. 两种创建镜像的过程.其中一些操作比较简单的镜像使用Dockerfile来创建,而像Weblogic这样复杂的应用,则使用commit方式来创建. Apache Apache是一个高稳定性的.商业级别的开源Web服务器.目前Apache已经是世界使用排名第一的Web服务器软件.由于其良

Tomcat学习总结(7)——Tomcat与Jetty比较

Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理器),所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler. 下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构成,整个 Server 组件是基于 Handler 容

Spring Boot 嵌入式 Tomcat 文件上传、url 映射虚拟路径

1.Java web 应用开发完成后如果是导入外置的 Tomcat 的 webapps 目录的话,那么上传的文件可以直接的放在应用的 web 目录下去就好了,浏览器可以很方便的进行访问. 2.Spring Boot 默认使用嵌入式 Tomcat ,将来打包成可执行 Jar 文件进行部署,显然打成 jar 包后,总不可能再将上传的文件放在 resources 目录下去了. 3.Spring Boot 于是提供了 url 地址匹配本地虚拟路径的功能: 1)上传文件到服务器,服务器将文件保存到了本地,

Tomcat专题(二)-----Tomcat源码、嵌入式Tomcat

Tomcat顶层结构 Server:服务器的意思,代表整个tomcat服务 器,一个tomcat只有一个Server: Service:Server中的一个逻辑功能层, 一个 Server可以包含多个Service: Connector:称作连接器,是Service的核心组 件之一,一个Service可以有多个Connector, 主要是连接客户端请求: Container:Service的另一个核心组件,按照 层级有Engine,Host,Context,Wrapper四种, 一个Servic

Docker+nginx+tomcat7配置简单的负载均衡

本文介绍在Docker上配置简单的负载均衡,宿主机为Ubuntu 14.04.2 LTS,两个CentOS容器,宿主机安装Nginx,两台容器安装tomcat7.结构如下: 此方案的原理是将宿主机的端口和docker容器的端口做一个映射(即访问宿主机的某端口会映射到docker容器对应的端口),然后在宿主机通过配置Nginx,即可达到访问宿主机的某端口,按规则分配到指定的服务地址,即完成了负载均衡. 配置步骤 1.准备宿主机,宿主机是Ubuntu 14.04.2 LTS,安装在Vmware中,具

Eclipse J2EE+Maven+Tomcat(Jetty)构建Spring MVC项目

一步一步的我们试着使用Eclipse J2EE+Maven+Tomcat(Jetty) 搭建留住的web开发平台 Spring MVC的方法. 工具:Eclipse J2EE,Maven,Tomcat Eclipse J2EE+Maven+Tomcat(Jetty):http://www.eclipse.org/downloads/ Maven 3.3.3:http://maven.apache.org/download.cgi Tomcat 7.X:http://tomcat.apache.o

简单看,tomcat源码(一)启动与监听

tomcat 作为知名的web容器,很棒! 本文简单了从其应用命令开始拆解,让我们对他有清晰的了解,揭开神秘的面纱!(冗长的代码流水线,给你一目了然) 话分两头: 1. tomcat是如何启动的? 2. tomcat是如何接收请求的? x. 应用程序是怎样接入tomcat的? 从何处开始? /etc/init.d/tomcat8 start # 简单的 tomcat8 脚本封装 . "$_"/usr/java/jdk1.8.0_101/bin/java org.apache.catal