idea下,Jetty採用main方法啟動web專案
對於maven多模組的spring web專案,本地開發時,啟動的方式一般有如下幾種:
- 使用容器(
tomcat
/jetty
/resin
等),該方式需要ide支援,而社群版的idea並不支援; - maven外掛(
jetty
/tomcat
),該方式只需在web模組的pom檔案
中加入外掛依賴,然後執行mvn jetty:run
或mvn tomcat7:run
即可,不過對於多模組專案而言,程式碼時改動需要使用maven
進行構建,而maven
構建需耗時良久; jetty
的main()
方法啟動,該方式啟動時,並不需要使用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. 編寫啟動類
由於引入包時,scope
為test
,因此該類需位於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
等)不能熱載入,每次修改後要重啟才能看到效果,大大地降低了開發效率,解決辦法如下:
- 找到
jetty-webapp-{version}.jar
包 - 在
org/eclipse/jetty/webapp/
路徑下找到webdefault.xml
,複製一份放到src/test/resources/
- 在
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
等,只要重新整理瀏覽器就能看到效果了。
最後,附上本人的程式碼結構:
相關推薦
idea下,Jetty採用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
WIN10下,Jdk的安裝方法及環境變數配置
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