为什么80%的码农都做不了架构师?>>>   

对于maven多模块的spring web项目,本地开发时,启动的方式一般有如下几种:

  1. 使用容器(tomcat/jetty/resin等),该方式需要ide支持,而社区版的idea并不支持;
  2. maven插件(jetty/tomcat),该方式只需在web模块的pom文件中加入插件依赖,然后运行 mvn jetty:runmvn tomcat7:run 即可,不过对于多模块项目而言,代码时改动需要使用maven进行构建,而maven构建需耗时良久;
  3. jettymain()方法启动,该方式启动时,并不需要使用maven进行构建,代码改动时仅需重新编译改动的源文件,且社区版的idea支持良好,本地开发时,是个不错的选择。

1. maven引入包

<!-- jetty相关依赖包,注意scope为test-->
<dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-webapp</artifactId><version>9.3.2.v20150730</version><scope>test</scope>
</dependency>
<dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-annotations</artifactId><version>9.3.2.v20150730</version><scope>test</scope>
</dependency>
<dependency><groupId>org.eclipse.jetty</groupId><artifactId>apache-jsp</artifactId><version>9.3.2.v20150730</version><scope>test</scope>
</dependency>
<dependency><groupId>org.eclipse.jetty</groupId><artifactId>apache-jstl</artifactId><version>9.3.2.v20150730</version><scope>test</scope>
</dependency>

2. 编写启动类

由于引入包时,scopetest,因此该类需位于src/test/java下。

import org.eclipse.jetty.jsp.JettyJspServlet;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;import java.io.File;public class JettyStart {public static void main(String[] args) throws Exception {//添加你的模块名,对于maven多模块项目,需要指定String moduleName = "module";String dir = System.getProperty("user.dir");if (!dir.contains(moduleName)) {dir = dir + File.separator + moduleName;System.setProperty("user.dir", dir);}int port = 8081;String contextPath = "/";WebAppContext webContext = new WebAppContext("src/main/webapp", contextPath);webContext.setClassLoader(Thread.currentThread().getContextClassLoader());//处理jsp解析问题webContext.addBean(new JspStarter(webContext));webContext.addServlet(JettyJspServlet.class, "*.jsp");//处理静态资源热加载问题webContext.setDefaultsDescriptor("src/test/resources/webdefault.xml");Server server = new Server(port);server.setHandler(webContext);server.setStopAtShutdown(true);server.start();server.join();}}

3. 解决jsp处理异常

如果项目中有jsp页面,访问时,可能会出现以下异常:

org.apache.jasper.JasperException: Unable to compile class for JSPat org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:600)at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:363)at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)at org.eclipse.jetty.jsp.JettyJspServlet.service(JettyJspServlet.java:107)at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:816)at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:566)at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1114)at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1048)at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:199)at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:74)at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1246)at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1029)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:973)......

解决该异常的方法是,在JettyStart.java的同一包下,加入以下类:

import org.apache.tomcat.util.scan.StandardJarScanner;
import org.eclipse.jetty.apache.jsp.JettyJasperInitializer;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.component.AbstractLifeCycle;public class JspStarter extends AbstractLifeCycle implements ServletContextHandler.ServletContainerInitializerCaller {JettyJasperInitializer sci;ServletContextHandler context;public JspStarter(ServletContextHandler context) {this.sci = new JettyJasperInitializer();this.context = context;this.context.setAttribute("org.apache.tomcat.JarScanner", new StandardJarScanner());}@Overrideprotected void doStart() throws Exception {ClassLoader old = Thread.currentThread().getContextClassLoader();Thread.currentThread().setContextClassLoader(context.getClassLoader());try {sci.onStartup(null, context.getServletContext());super.doStart();} finally {Thread.currentThread().setContextClassLoader(old);}}}

4.解决jstl异常

项目的jsp页面中使用了jstl标签,还是会报错:

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this applicationat org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:55)at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:277)at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:75)at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTldResourcePath(TagLibraryInfoImpl.java:243)at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:124)at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:411)at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:469)at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1430)at org.apache.jasper.compiler.Parser.parse(Parser.java:139)at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:227)at org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:199)at org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)at org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)at org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:585)at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:363)at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)at org.eclipse.jetty.jsp.JettyJspServlet.service(JettyJspServlet.java:107)

这时,需要找到 jstl 实现包,这里使用的是 glassfish 实现,在maven仓库路径为C:\Users\Administrator\.m2\repository\org\glassfish\web\jstl-impl\1.2,在该路径下找到jstl-impl-1.2.jar,用解压工具解压,在 META-INF 目录下找到以下几个文件:

复制到项目的WEB-INF/jstl-tld目录下(jstl-tld需要手动创建):

5.处理静态文件不能热加载问题

经过以上步骤后,项目能正常启动,也能正常访问了,但有一点特别坑:静态文件(html/js/css等)不能热加载,每次修改后要重启才能看到效果,大大地降低了开发效率,解决办法如下:

  1. 找到jetty-webapp-{version}.jar
  2. org/eclipse/jetty/webapp/路径下找到webdefault.xml,复制一份放到src/test/resources/
  3. src/test/resources/webdefault.xml中找到
<init-param><param-name>useFileMappedBuffer</param-name><param-value>true</param-value> <!-- 将值修改为false -->
</init-param>

param-value值修改为true即可。

重启项目,接下来修改html/js/css等,只要刷新浏览器就能看到效果了。

最后,附上本人的代码结构:

转载于:https://my.oschina.net/funcy/blog/3039139

idea下,Jetty采用main方法启动web项目相关推荐

  1. main spring启动_SpringBoot学习(一):为什么main方法启动类需要放在项目根目录...

    一.概述 使用SpringBoot的应用是需要将应用代码编译打包成jar包,然后基于main方法的方式来独立启动这个应用,使得该应用作为一个独立进程运行.这是跟传统的将项目打包成war包,然后部署到t ...

  2. 使用main方法启动spring程序

    使用main方法启动spring程序 在 spring 框架中,由于对象都交给了 IoC 容器进行管理,那么直接在 main 方法中创建 service 层对象,就会出现空指针异常(NPE) 正确的方 ...

  3. IDEA启动Web项目后,在Tomcat中的webapp文件夹下找不到?

    转载: (81条消息) IDEA启动Web项目后,在Tomcat中的webapp文件夹下找不到?_菩提小猿的博客-CSDN博客_idea中部署到tomcat的项目在webapps下找不到

  4. 使用Maven tomcat:run命令启动web项目时修改默认端口的方法

    在使用maven时,修改插件tomcat启动端口.一开始我在pom.xml配置文件里面修改,如下面所示: 1 2 3 4 5 6 7 8 9 <plugin> <groupId> ...

  5. idea启动web项目,自带tomcat找不到解决方法(个例)

    idea启动web项目,自带tomcat找不到解决方法(个例) 删除web项目的.idea文件夹 重新导入web项目

  6. 启动web项目(maven)

    启动web项目(maven) 步骤6点击进去这个样子 点击步骤8后界面 最后别忘了点击apply和ok按钮,然后就可以启动项目了.

  7. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上_下造型,main方法,抽象类,接口,设计模式,异常,内部类

    1 Day06–面向对象1 1.1 面向对象 1.1.1 概念 推荐看的书:Thinking in java 概念:所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的 ...

  8. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上/下造型,main方法,抽象类,接口,设计模式,异常,内部类

    1 Day06–面向对象1 1.1 面向对象 1.1.1 概念 推荐看的书:Thinking in java 概念:所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的 ...

  9. maven学习笔记之IDEA+Maven+Jetty运行一个简单的web项目

    maven学习笔记 一.什么是maven Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Life ...

最新文章

  1. 全球物联网产业规模不断扩大 中国市场前景分析
  2. docker连接容器外部的mysql
  3. JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区
  4. [CQOI2009]叶子的染色
  5. android 访问权限,Android 使用情况访问权限
  6. 配置 --- 将本地项目部署到阿里云上
  7. 前端学习(3271):js中this的使用
  8. h.323 服务器 作用,Cisco CallManager服务器冗余的H.323 网关拨号对端配置
  9. Python导入全局、局部模块以及如何让避免循环导入
  10. Python 使用 smtp ssl 模式 发送邮件与附件
  11. 利用lamda函数 的函数式编程 实现scrapy审计外网安全问题
  12. 链表竟然比数组慢了1000多倍?(动图+性能评测)
  13. utools插件开发之监听按键的命令和状态
  14. 网络操作 回调函数 http
  15. Proj.4 API 中文参考
  16. python--条件判断和循环--3
  17. 计算机vfp系统,计算机等级考试VFP教程:第一章数据库系统
  18. 怎么对linux系统的硬盘检测,详解Linux系统中hdparm硬盘检测工具的使用
  19. HTML5+CSS网页设计概述
  20. python xlrd 写入已有的excel并保留原excel格式

热门文章

  1. 我的个人博客搭建记录
  2. Redis源码分析-TCMalloc
  3. 跨平台PHP调试器设计及使用方法——使用
  4. 朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型
  5. 一种注册表沙箱的思路、实现——注册表的一些基础知识
  6. 一维码Codabar简介及其解码实现(zxing-cpp)
  7. 【FFmpeg】windows下的库下载
  8. 【Qt】error: undefined reference to `vtable for MainWindow‘
  9. linux 从命令行启动,Linux下常见服务在命令行方式的启动
  10. Java项目:资源下载工具(java+swing)