使用jetty作為內嵌伺服器啟動專案
需求:把jetty作為內嵌的一個伺服器,直接啟動,web專案不用部署在應用伺服器中。在網上搜索了一些資料,參照後,都沒有成功,經過3天的研究,終於搞定了,記錄在此,以備查詢。
最開始用的jetty8.1,沒成功,後又下載7.6,仍然沒有成功,最後使用了jetty7.0後成功。對於8.1和7.6後來沒有再試,應該是一樣的步驟,有興趣或者有時間容後再試。
步驟:
1、首先下載jetty的jar包。
我下載的是jetty-all-7.0.2.v20100331.jar,servlet-api-2.5.jar。
參照網上的一個資料。
從
http://search.maven.org, 輸入 jetty-all-,搜尋,然後找到版本-7.0.2.v20100331的jar下載。
說明:直接從jetty官網上下載jetty的jar包應該是一樣的。我之所以下載這個,是因為之前用8.1版本jar包時候的總是提示server沒有start這個方法,因為當時不曉得是jar包的問題還是其他什麼問題,所以只好更換jar包進行重新測試。
2、寫啟動檔案。
MyServer.java
import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.webapp.WebAppContext; public class MyServer { public static void main(String[] args) throws Exception { Server server = new Server(); Connector connector = new SelectChannelConnector(); connector.setPort(8080); server.setConnectors(new Connector[] { connector }); WebAppContext webAppContext = new WebAppContext("WebContent","/myProject"); //webAppContext.setContextPath("/"); webAppContext.setDescriptor("WebContent/WEB-INF/web.xml"); webAppContext.setResourceBase("WebContent"); webAppContext.setDisplayName("myProject"); webAppContext.setClassLoader(Thread.currentThread().getContextClassLoader()); webAppContext.setConfigurationDiscovered(true); webAppContext.setParentLoaderPriority(true); server.setHandler(webAppContext); System.out.println(webAppContext.getContextPath()); System.out.println(webAppContext.getDescriptor()); System.out.println(webAppContext.getResourceBase()); System.out.println(webAppContext.getBaseResource()); try { server.start(); } catch (Exception e) { e.printStackTrace(); } System.out.println("server is start"); } }
3、直接在MyServer.java上點選右鍵,run as -java application
4、在web.xml裡面定義一個起始頁面,比如index.jsp.
5、在webcontent下建立這個index.jsp檔案。
6、在瀏覽器內輸入:http://localhost:8080/myProject。
ok,可以看到這個jsp檔案了。
就是如此的簡單。
總結:
1、剛開始做的時候,參照網上的一些資料,在spring的配置檔案裡,加入了一堆jetty的<bean>設定,其實完全沒有必要。
2、最開始啟動成功後,訪問html檔案可以成功,但是訪問action總提示不存在,應該是路徑的問題,後檢視jetty的文件,加入了
webAppContext.setClassLoader(Thread.currentThread().getContextClassLoader());
這句話很重要,是定位class檔案位置的。
3、專案檔名的加入,需要
webAppContext.setContextPath("專案名");
否則的話,訪問的時候就沒有專案名稱了。
目前需要寫個bat檔案,用於雙擊執行服務。
qidong.bat
echo off
@set LOCALCLASSPATH=./WebContent/WEB-INF/classes/
@for %%i in (".\WebContent\WEB-INF\lib\*.jar") do call "setpath.bat" %%i
set CLASSPATH=%LOCALCLASSPATH%;%CLASSPATH%
echo on
java -Dxport="%1" -Xmx512m com.jetty.MyServer %2 %3 %4
setpath.bat
@set LOCALCLASSPATH=%LOCALCLASSPATH%;%1
啟動後,訪問瀏覽器,報
HTTP ERROR 500
Problem accessing /cipoa/common/error/500code.jsp. Reason:
JSP support not configuredPowered by Jetty://
異常。
但是在eclipse裡啟動訪問是正常的。
在網上搜是沒有加入jetty對jsp支援的jar包,需要下載15m版本的jar包。
下載到這個15m的jar包後,將其中jsp資料夾下的jar包拷貝到專案中,再啟動,果然成功。