jetty的安裝和啓動

Jetty是當下非常流行的一款輕量級Java Web服務器和Servlet容器實現,它由Eclipse基金會託管,完全免費而且開放源代碼,因此所有人均可以從其官網下載最新源代碼進行研究。由於其輕量、靈活的特性,Jetty被廣泛用於一系列知名產品,例如ActiveMQ、Maven、Spark、Google App Engine、Eclipse、Hadoop等等。下面就來研究如何安裝和啓動jetty。
1.安裝
http://www.eclipse.org/jetty/previousversions.html網址可以下載不同版本的jetty,不同版本要求的jdk版本是不同的,根據自己jdk版本進行下載,下載完成之後,直接解壓就可以使用,解壓之後的路徑是:”/test/jetty/jetty-distribution-9.2.21.v20170120”,下面是這個路徑下解壓後目錄和文件的解釋。

目錄 作用
bin/ 用於存放jetty的啓動腳本,目前僅提供liunx/unix下的腳本
demo-base/ 存放一個用於演示的工程
etc/ jetty存放xml配置文件的目錄
lib/ 存放jetty運行時依賴的jar包,包括jetty各個模塊的jar包,可以說這裏就是真正的jetty
logs/ 存放請求日誌的目錄
modules/ 模塊定義目錄,存放jetty模塊定義文件(*.mod)
resources/ 存放類路徑下的資源文件,比如log4j.xml,存放在這個目錄下的文件在jetty啓動時會被加入到classpath
start.ini 存放命令行啓動jetty時需要的一些列參數
start.jar 用於啓動jetty的jar文件
webapps 運行於Jetty默認配置下的Web應用部署目錄(一般實際部署應用會重新創建一個另外一個目錄作爲Jetty_base路徑)

2.啓動
一般情況下都可以通過start.jar包來啓動jetty,除此之外,在linux/unix下還可以通過jetty.sh來進行啓動.下面分別介紹着兩種啓動方式:
1) start.jar
這是最通用,也是最靈活的啓動方式,無論是在linux下還是在unix下都可以通過這種方式進行啓動

  cd $JETTY_HOME
  java -jar start.jar

上面的命令中涉及到了JETTY_HOME這個變量,表示的是jetty的安裝目錄,也就是”/test/jetty/jetty-distribution-9.2.21.v20170120”目錄;在jetty中有兩個常用的目錄概念,第一個就是JETTY_HOME,表示的是jetty的安裝目錄,可以通過系統屬性jetty.home來引用;第二個是jetty的實例路徑,用JETTY_BASE代表,表示存放web應用及其配置文件的一個目錄,可以通過系統屬性jetty.base來引用,比如上面的demo-base其實就是一個JETTY_BASE目錄。設置兩個目錄屬性的好處在於將web應用程序及其配置和jetty安裝目錄相分離,從而實現最小化jetty升級的影響。啓動之後可以看到下面的輸出信息:

2017-11-30 21:47:44.156:INFO::main: Logging initialized @367ms
2017-11-30 21:47:44.199:WARN:oejs.HomeBaseWarning:main: This instance of Jetty is not running from a separate {jetty.base} directory, this is not recommended.  See documentation at http://www.eclipse.org/jetty/documentation/current/startup.html
2017-11-30 21:47:44.327:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2017-11-30 21:47:44.343:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/test/jetty/jetty-distribution-9.2.21.v20170120/webapps/] at interval 1
2017-11-30 21:47:44.362:INFO:oejs.ServerConnector:main: Started ServerConnector@25e9a396{HTTP/1.1}{0.0.0.0:9800}
2017-11-30 21:47:44.363:INFO:oejs.Server:main: Started @574ms

從信息中我們可以web應用的部署目錄爲$JETTY_HOME/webapps,啓動端口是9800,其實默認的jetty啓動端口是8080,這裏的9800是另外配置的。還可以看到jetty提示應該從JETTY_BASE目錄下進行部署,而不是直接在安裝目錄下進行部署。我們可以進入存放演示工程的demo-base目錄再進行一次部署。下面是部署日誌:

2017-11-29 20:36:18.832:INFO::main: Logging initialized @362ms
2017-11-29 20:36:19.067:WARN::main: demo test-realm is deployed. DO NOT USE IN PRODUCTION!
2017-11-29 20:36:19.070:INFO:oejs.Server:main: jetty-9.2.21.v20170120
2017-11-29 20:36:19.084:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/test/jetty/jetty-distribution-9.2.21.v20170120/demo-base/webapps/] at interval 1
2017-11-29 20:36:20.174:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@5defbbf{/,file:/test/jetty/jetty-distribution-9.2.21.v20170120/demo-base/webapps/ROOT/,AVAILABLE}{/ROOT}
2017-11-29 20:36:20.313:WARN::main: test-spec webapp is deployed. DO NOT USE IN PRODUCTION!
Calling TestListener.contextInitialized
2017-11-29 20:36:20.450:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@3fec9e59{/test-spec,[file:/private/var/folders/vp/3cqtvm496310hg9321jqh5dr0000gn/T/jetty-0.0.0.0-9800-test-spec.war-_test-spec-any-8174046145751790923.dir/webapp/, jar:file:/private/var/folders/vp/3cqtvm496310hg9321jqh5dr0000gn/T/jetty-0.0.0.0-9800-test-spec.war-_test-spec-any-8174046145751790923.dir/webapp/WEB-INF/lib/test-web-fragment-9.2.21.v20170120.jar!/META-INF/resources],AVAILABLE}{/test-spec.war}
2017-11-29 20:36:20.671:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@41af39f0{/proxy,file:/private/var/folders/vp/3cqtvm496310hg9321jqh5dr0000gn/T/jetty-0.0.0.0-9800-xref-proxy.war-_xref-proxy-any-8156636816406605251.dir/webapp/,AVAILABLE}{/xref-proxy.war}
2017-11-29 20:36:20.757:WARN::main: test-jndi webapp is deployed. DO NOT USE IN PRODUCTION!
2017-11-29 20:36:20.826:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@300ae308{/test-jndi,file:/private/var/folders/vp/3cqtvm496310hg9321jqh5dr0000gn/T/jetty-0.0.0.0-9800-test-jndi.war-_test-jndi-any-1314351555443006520.dir/webapp/,AVAILABLE}{/test-jndi.war}
2017-11-29 20:36:20.968:WARN::main: test webapp is deployed. DO NOT USE IN PRODUCTION!
2017-11-29 20:36:21.070:INFO:oejsh.:main: Started o.e.j.w.WebAppContext@412bc86d{/test,file:/private/var/folders/vp/3cqtvm496310hg9321jqh5dr0000gn/T/jetty-0.0.0.0-9800-test.war-_test-any-8161155482385980125.dir/webapp/,AVAILABLE}{/test.war}
2017-11-29 20:36:21.119:WARN::main: test-jaas webapp is deployed. DO NOT USE IN PRODUCTION!
2017-11-29 20:36:21.156:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@4ec5e60d{/test-jaas,file:/private/var/folders/vp/3cqtvm496310hg9321jqh5dr0000gn/T/jetty-0.0.0.0-9800-test-jaas.war-_test-jaas-any-2704129059056436982.dir/webapp/,AVAILABLE}{/test-jaas.war}
2017-11-29 20:36:21.262:WARN::main: async-rest webapp is deployed. DO NOT USE IN PRODUCTION!
2017-11-29 20:36:21.294:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@7ee28774{/async-rest,[file:/private/var/folders/vp/3cqtvm496310hg9321jqh5dr0000gn/T/jetty-0.0.0.0-9800-async-rest.war-_async-rest-any-7133942508641408007.dir/webapp/, jar:file:/private/var/folders/vp/3cqtvm496310hg9321jqh5dr0000gn/T/jetty-0.0.0.0-9800-async-rest.war-_async-rest-any-7133942508641408007.dir/webapp/WEB-INF/lib/example-async-rest-jar-9.2.21.v20170120.jar!/META-INF/resources],AVAILABLE}{/async-rest.war}
2017-11-29 20:36:21.300:INFO:oejsh.ContextHandler:main: Started o.e.j.s.h.MovedContextHandler@6a4554de{/oldContextPath,null,AVAILABLE}
2017-11-29 20:36:21.310:INFO:oejs.ServerConnector:main: Started ServerConnector@765d27b4{HTTP/1.1}{0.0.0.0:9800}
2017-11-29 20:36:21.323:INFO:oejs.ServerConnector:main: Started ServerConnector@28ef1ce5{SSL-http/1.1}{0.0.0.0:8443}
2017-11-29 20:36:21.323:INFO:oejs.Server:main: Started @2853ms

可以看到部署目錄變成了$JETTY_HOME/demo-base/webapps,另外因爲demo-base下的webapps下同時存在好幾個應用,所以會有多個應用啓動的信息。另外jetty不會將war包直接解壓到部署目錄,而是解壓到了臨時目錄,jetty默認的臨時目錄爲系統臨時目錄(使用的是java.io.tmpdir環境變量的值)。當然,臨時目錄可以通過不同的方式進行變更。
demo-base默認部署了六個應用(除ROOT),用於演示不同的功能特性,部署目錄中除了包含相關的WAR包外還有各個應用的配置文件,見下圖:
這裏寫圖片描述
在瀏覽器中輸入127.0.0.1:9800就可以看到ROOT中index.html定義好的頁面。
這裏寫圖片描述
start.jar的基本命令格式如下:

java -jar [選項...] [屬性...] [配置...]

常見的選項配置如下:
這裏寫圖片描述
這裏寫圖片描述
除了上面的選擇,start.jar還支持設置屬性(格式如”key=value”),這些屬性可以影響jetty的啓動,常見的屬性有jetty.home jetty.base,jetty.http.host jetty.port等。
上面已經提到可以自己創建JETTY_BASE目錄,然後將應用部署到這個目錄下,先在JETTY_HOME目錄下創建一個base-test目錄,然後在這個目錄直接執行命令,這時候會報如下錯誤:

WARNING: Nothing to start, exiting ...

Usage: java -jar start.jar [options] [properties] [configs]
       java -jar start.jar --help  # for more information

這是因爲還沒對這個目錄進行配置,參考下demo-base目錄就會發現還缺少一些配置文件以及webapps目錄,當然這些不需要我們手動創建,可以通過java -jar $JETTY_HOME/start.jar --add-to-startd=http,deployjava -jar $JETTY_HOME/start.jar --add-to-start=http,deploy添加啓動模塊,運行完命令之後,會在當前目錄下新建start.d或start.ini和webapps目錄。而在start.d目錄下會新增http.ini deploy.ini server.ini三個配置文件,而webapps目錄爲空。如果這時候通過start.jar進行啓動,我們看到的仍會是404頁面,我們可以通過將web應用拷貝到webapps目錄下去進行部署。
通過以上過程可以知道,Jetty通過命令行可以很容易的完成基礎目錄的初始化(模塊按需指定)以及Web應用部署,這給Jetty服務器實例的維護帶來了極大的便利。結合動態的端口分配(由jetty.port屬性指定,可以作爲start.jar的參數傳入),我們可以非常方便的在一臺物理機上批量初始化和運行Jetty實例。
2) jetty.sh
在linux下jetty還提供了一個腳本(JETTY_HOME/bin/jetty.sh)來進行jetty的啓動,所以也可以通過下面的命令來啓動jetty:./$JETTY_HOME/bin/jetty.sh start (注意權限問題),當然也可以直接進到jetty安裝路徑的bin目錄下執行。jetty.sh可以接受的參數如下:
這裏寫圖片描述

通過jetty.sh來啓動jetty時,會默認將jetty的安裝目錄作爲jetty.base路徑,如果要修改,可以通過編輯jetty.sh文件,在頂部添加如“JETTY_BASE=/opt/jetty-base”,將JETTY_BASE變更爲自己希望的目錄(當然在這之前,我們需要確保已對該目錄進行了初始化)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章