1. 程式人生 > >idea下,Jetty採用main方法啟動web專案

idea下,Jetty採用main方法啟動web專案

對於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 JSP
	at 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());
    }

    @Override
    protected 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 application
	at 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等,只要重新整理瀏覽器就能看到效果了。

最後,附上本人的程式碼結構:

相關推薦

ideaJetty採用main方法啟動web專案

對於maven多模組的spring web專案,本地開發時,啟動的方式一般有如下幾種: 使用容器(tomcat/jetty/re

SpringBoot學習(三)兩種啟動方式-以main方法啟動和在tomcat裡啟動

        sprigboot既可以直接通過main方法啟動,也可以在tomcat裡啟動,在main方法裡啟動很簡單,直接run啟動類的main方法就可以了。         在tomcat裡啟動

spring boot 打包可以運行但是執行main方法不能運行

配置 embed files 可能 active set *** rest epo 報錯信息如下 2017-10-23 15:16:09.750 ERROR 7664 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisR

java--建立一個Test類包含有一個public許可權的int型成員變數與一個char型別的成員變數觀察在main方法中的初始值。

//建立一個Test類 class Test1{ //包含有一個public許可權的int型成員變數與一個char型別的成員變數 public int a; public char c; } //主類 public class Test{ //主函式 publ

idea tomcat啟動web專案html、js等靜態資源不自動載入解決方案

寫程式碼寫久了,會有程式碼是調試出來不是寫出來的感覺。今天剛剛開啟一個專案,發現修改html或者js等資源後,在瀏覽器重新整理清快取等根本不會載入最新的html檔案,除非重啟tomcat效。不斷重啟tomcat,太費時間了。下面是筆者總結的html不自動更新的處理步驟,筆者用的是mac: 1

WIN10Jdk的安裝方法及環境變數配置

JDK的安裝 首先下載JDK:link. 1、選擇接受協議,不然無法下載; 2、點選x64後面的藍色連結獲取下載地址。 下載完成後雙圖示進入安裝介面,點選下一步 選擇安裝路徑並點選下一步: 然後會出現如下介面: 這步實際上是安裝JRE,JDK中也包

idea的spring boot remote debug 啟動辦法

最近做個spring  boot的專案,因為涉及到dubbo,採用的是   spring-boot:run 啟動的工程 下面的圖那個樣子 需要在pom.xml使用這個plugins

.NET採用的是哪種方式進行資料操作?

進行資料庫進行更新操作時,有許多種方式,你使用的是哪種?這裡假設一個數據庫中有一張表,表名為Test,列為colID,colTest1,colTest2,colTest3。其中,colTest1,colTest2,colTest3為nvarchar(50),而colID為int;一、資料介面卡+型別化的資料集

springboot+kotlin專案中Application中的main方法啟動報錯

Kotlin 小科普這裡大家一個小科普,Kotlin是完全相容JVM,完全無縫支援Java,並且在您可以在Java和 Kotlin 來回自如的切換,所以開文就借用了官方的一句話,是 Android中的 Swift。就好比 Swift一樣,在支援 Swift新語法的時候,也支援

springboot專案中多個main方法啟動問題

SpringBoot專案通過掃描整個專案查詢main方法來啟動整個web。但是當專案中含有不止一個標準main方法時,專案打包成jar包時可能無法正常啟動,找不到要啟動的main; 1 修改pom.xml檔案,用如下方式實現 修改pom.xml檔案,

linux/mac tomcat以debug模式啟動

step 1: 修改catalina.sh: 在檔案開頭,加入以下內容:export JPDA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=0.0.0.0:8000其中 8000是deb

單獨啟動tomcat和從eclipse中啟動tomcat的差異以及將Eclipse中的Web專案部署到Tomcat的方法

         剛接觸java web,對很多東西還不是太瞭解,特別是各種配置方面的問題,下面僅是自己個人的理解,如有錯誤或不足之處,希望大家能指教。          如果通過tomcat的bin目錄下的startup.bat來啟動tomcat,此時tomcat使用co

flume1.7原始碼編譯及main方法啟動

一、編譯 首先下載flume1.7原始碼,匯入eclipse 1.Maven依賴報錯Missing artifact jdk.tools:jdk.tools:jar:1.7 新增依賴 <

dubbo的main方法啟動

想到一個問題:公司專案是dubbo實現服務治理的,啟動dubbo是通過自帶的main方法,這個方式 要求spring配置檔案存放至 classpath*:META-INF/spring/*.xml

linux( Ubuntu15.04) 和 win7 雙系統情況正常關閉win7 無法啟動無法修復提示版本不相容

前一天正常關機 0.開了一次linux。 1.啟動win7試了多次,都不行正常啟動window。 2.嘗試到linux下查引導發現也沒有什麼問題,況且到修復介面說明引導過來了,否則可能都到不了這個

Interllij IDEA啟動web專案

1、在IDEA中開啟你的Web應用,點選一下綠色三角形左邊的框框,然後在彈出框上選擇Edit Configurations,會彈出一個配置面板。 2、在彈出的面板中我們點選Defaults,然後找到Tomcat Server並點選。緊接著我們點選右邊的綠色加號,會有一個Add New Configura

IDEA啟動web專案報錯

1.問題: MLog initialization issue: slf4j found no binding or threatened to use its (dangerously silent) NOPL 報錯介面: 解決參考: SLF4J:無法載入類“org.slf4

springWeb專案啟動時自動載入方法web專案啟動時不能獲得spring的bean的解決方式

方式一:利用註解的方式和構造方法 @Service("testService") public class TestService { @Autowired private Service service; /** * spring在初始化bea

Eclipse中使用jetty啟動web專案

第一步: pom.xml的配置: <build> <plugins> <plugin> <groupId>org.mortbay.jetty&l

【問題記錄】eclipse啟動web專案spring會初始化兩次

背景:一個tomcat,一個eclipse,一個SSM框架的web專案。在eclipse中新建tomcat伺服器,預設配置,然後在伺服器配置中將Server Locations改成Use Tomcat