xylz,imxylz

          關注后端架構、中間件、分布式和并發編程

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks
          Jetty提供了眾多的參數和配置來保證滿足不同場景下的啟動方式。

          除了極大方便嵌入式啟動之外,從程序外部也非常好容易啟動jetty。

          [原文:http://www.aygfsteel.com/xylz/archive/2012/03/28/372923.html]

          運行方式

          運行方法1

          首先我們以一個標準的jar程序啟動來看待這個問題.
          [adyliu@adyliu-pc jetty8]$ cat run.sh 
          #!/bin/bash


          JETTY_CLASSPATH="./start.jar"
          for f in `find ./lib -name "*.jar"`
          do
              JETTY_CLASSPATH=$JETTY_CLASSPATH:$f
          done

          #echo $JETTY_CLASSPATH
          java -cp $JETTY_CLASSPATH $*

          然后運行查看下
          [adyliu@adyliu-pc jetty8]$ sh run.sh org.eclipse.jetty.start.Main
          2012-03-28 16:00:57.532:INFO:oejs.Server:jetty-8.1.2.v20120308
          2012-03-28 16:00:57.578:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080

          由于沒有任何web環境,因此此時訪問任何地址應該都是404。測試一下:
          [adyliu@adyliu-pc jetty8]$ curl -v http://127.0.0.1:8080
          * About to connect() to 127.0.0.1 port 8080
          *   Trying 127.0.0.1 connected
          * Connected to 127.0.0.1 (127.0.0.1) port 8080
          > GET / HTTP/1.1
          > User-Agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
          > Host: 127.0.0.1:8080
          Accept: */*

          < HTTP/1.1 404 Not Found
          < Date: Wed, 28 Mar 2012 08:15:27 GMT
          < Content-Type: text/html
          < Content-Length618
          < Server: Jetty(8.1.2.v20120308)
          <HTML>
          <HEAD>
          <TITLE>Error 404 - Not Found</TITLE>
          <BODY>
          <H2>Error 404 - Not Found.</H2>

          運行方法2

          另外上述運行等價于:
          [adyliu@adyliu-pc jetty8]$ sh run.sh org.eclipse.jetty.xml.XmlConfiguration etc/jetty.xml
          2012-03-28 16:31:16.481:INFO:oejs.Server:jetty-8.1.2.v20120308
          2012-03-28 16:31:16.518:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080

          運行方法3

          第三種方法就是使用封裝好的start.jar,這個jar包封裝了一些常規的配置。

          在開始之前,我們先重命名下默認的start.ini,因為默認的配置文件會啟動一個test.war環境。
          mv start.ini start.ini.default
          [adyliu@adyliu-pc jetty8]$ java -jar start.jar
          2012-03-28 16:35:21.941:INFO:oejs.Server:jetty-8.1.2.v20120308
          2012-03-28 16:35:21.992:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080

          可以看出這個方式和第一種、第二種完全相同。
          另外start.jar提供了一種可以查看當前運行參數的命令:
          java -jar start.jar --dry-run

          可能輸出:
          /opt/apps/jdk/bin/java -Djetty.home=/opt/apps/jetty8 -cp /opt/apps/jetty8/resources:\
          /opt/apps/jetty8/lib/jetty-xml-8.1.2.v20120308.jar:/opt/apps/jetty8/lib/servlet-api-3.0.jar:\
          /opt/apps/jetty8/lib/jetty-http-8.1.2.v20120308.jar:/opt/apps/jetty8/lib/jetty-continuation-8.1.2.v20120308.jar:\
          /opt/apps/jetty8/lib/jetty-server-8.1.2.v20120308.jar:/opt/apps/jetty8/lib/jetty-security-8.1.2.v20120308.jar:\
          /opt/apps/jetty8/lib/jetty-servlet-8.1.2.v20120308.jar:/opt/apps/jetty8/lib/jetty-webapp-8.1.2.v20120308.jar:\
          /opt/apps/jetty8/lib/jetty-deploy-8.1.2.v20120308.jar:/opt/apps/jetty8/lib/jetty-servlets-8.1.2.v20120308.jar:\
          /opt/apps/jetty8/lib/jetty-util-8.1.2.v20120308.jar:/opt/apps/jetty8/lib/jetty-io-8.1.2.v20120308.jar \
          org.eclipse.jetty.xml.XmlConfiguration /tmp/start1059041541723976621.properties /opt/apps/jetty8/etc/jetty.xml

          有意思的是這里有一個臨時文件:/tmp/start1059041541723976621.properties,里面記錄了所有系統屬性,也就是類似System.getProperties()。
          除非是嵌入式開發,否則我們都是用start.jar來啟動jetty。

          命令參數

          start.jar提供了大量的參數來負責啟動JVM。
          下面命令列出所有的命令行參數:
          java -jar start.jar --help

          現在問題來了,這些默認的參數都是哪來的?例如,如果想改變${jetty.home}又怎樣?
          jetty內部默認提供了一個默認的配置文件start.config來解決此問題。
          默認情況下start.jar里面帶有一個默認的start.config文件,這個文件有一些預置的定義。
          [adyliu@adyliu-pc jetty8]$ jar tvf start.jar | grep start.config
            8669 Fri Mar 09 00:13:12 CST 2012 org/eclipse/jetty/start/start.config

          start.config
           文件內容非常大,其中大部分是注釋。

          start.config的作用有以下幾個:

          • 定義jetty.home屬性
          • 定義jetty啟動類
          • 定義jetty啟動的默認配置文件
          • 定義OPTIONS
          • 根據OPTIONS來定義classpath

          上面特別提到OPTIONS。什么是OPTIONS?

          OPTIONS

          由于jetty是高度可定制的,因此jetty將各個模塊拆分成各個非常細小的模塊。每一個模塊(實際上是一個個的jar包),我們可以簡單的看出是一個OPTION。而每一個OPTION都會對應于實際的jar,這就決定了這些jar包是否需要加入classpath,并且在jetty啟動的時候是否需要做一些額外的事情。

          start.config文件的語法也挺有意思的。支持一些簡單的邏輯判斷,例如文件是否存在、命令行參數是否存在等。

          默認情況下有如下配置:

          • path參數的值加入classpath
          • lib參數的值作為目錄搜索jar包,其中的jar/zip包加入classpath
          • 默認的啟動類是org.eclipse.jetty.xml.XmlConfiguration.class,除非定義了start.class屬性
          • 默認的jetty配置文件是$(jetty.home)/etc/jetty.xml,除非傳入的參數不為空
          • 默認${jetty.home}目錄是當前目錄(不一定是start.jar所在路徑)。${jetty.home}屬性搜索順序有:
            • $(jetty.home) 參數或者系統屬性(包括環境變量)
            • . 當前路徑
            • .. 當前路徑的父路徑
            • jetty-distribution/src/main/resources 當前路徑的發行版子路徑
            • ../jetty-distribution/src/main/resources 當前路徑的父路徑的發行版子路徑
          • 默認的classpath有:
            • resources
            • lib/jetty-xml-8.1.2.v20120308.jar
            • lib/servlet-api-3.0.jar
            • lib/jetty-http-8.1.2.v20120308.jar
            • lib/jetty-continuation-8.1.2.v20120308.jar
            • lib/jetty-server-8.1.2.v20120308.jar
            • lib/jetty-security-8.1.2.v20120308.jar
            • lib/jetty-servlet-8.1.2.v20120308.jar
            • lib/jetty-webapp-8.1.2.v20120308.jar
            • lib/jetty-deploy-8.1.2.v20120308.jar
            • lib/jetty-servlets-8.1.2.v20120308.jar
            • lib/jetty-util-8.1.2.v20120308.jar
            • lib/jetty-io-8.1.2.v20120308.jar

          start.jar參數

          我們再來看start.jar支持的參數:

          [adyliu@adyliu-pc jetty8]# java -jar start.jar --help
          Usage: java -jar start.jar [options] [properties] [configs]

          options

          其中options列表(這指的是命令行參數,不是模塊,由此可見jetty將內置的OPTIONS定義為模塊多好)有:

          • --version 列出版本號
          • --list-options 列出當前start.config支持的所有OPTIONS
          • --list-config 列出當前start.config內容(文本內容)
          • --dry-run 列出當前配置要啟動的java進程完整參數(不啟動jetty服務)
          • --exec 啟動子進程(只有啟動子進程才能修改-X,-D等參數,因為start.jar本身就是依靠java進程啟動的,不能在運行時改變)
          • --stop 停止運行的jetty實例
          • --daemon 后臺運行jetty,啟動將stdout/stderr記錄到${jetty.log}/start.log中(好了,這個變量jetty.log沒有默認配置說明,估計是${jetty.home}/logs目錄)
          • --config=<file> 指定特別的start.config,以便覆蓋內置的start.config.(經過測試,如果指定此文件,那么內置的配置將不再讀取,這導致必須將所有配置寫全,包括mainclass/jetty config/OPTIONS等)
          • --ini=<file> 從配置文件中裝載命令行參數。上面參數以及下面提到的參數是在太多,可以從配置文件中一次性加載,默認的配置文件是${jetty.home}/start.ini。
          • --pre=<file> 指定特別的jetty運行配置文件,這個配置文件在后面提高的配置文件前面運行,相當于改變默認的裝載機制。

          properties

          屬性分成兩種,一種是會傳遞給系統屬性(java.lang.System#getProperty(String)),一種只是作為jetty的啟動參數。

          如果要傳遞給系統屬性,則格式是: -Dname=value,和java進程系統屬性類似。

          jetty也有一些默認的系統屬性:

          屬性類型描述
          org.eclipse.jetty.util.log.class class jetty日志記錄,默認為:org.eclipse.jetty.util.log.Slf4jLog
          org.eclipse.jetty.util.log.DEBUG boolean 調試日志輸出地方,默認為stderr和java內置的Logger,如果是其他日志則需要設置為true,默認為false
          org.eclipse.jetty.util.log.IGNORED boolean 是否記錄一些忽略的錯誤日志,默認為false
          org.eclipse.jetty.util.log.SOURCE boolean 記錄錯誤日志行號?位置?默認為false
          com.sun.management.jmxremote   啟動jmx管理

          jetty的啟動參數屬性,格式是: name=value,注意這里沒有-D了。這些參數不會傳遞給系統屬性。

          所有參數列表:

          • path=[directory]: 傳遞額外的classpath,參考上面默認的start.config配置
          • lib=[directory]: 傳遞額外classpath搜索jar/zip的目錄
          • STOP.PORT=[number]: 停止jetty的端口(遠程管理)
          • STOP.KEY=[alphanumeric]: 停止jetty的密碼(遠程管理)
          • DEBUG=true: 是否啟動調試模式,同時會設置org.eclipse.jetty.util.log.DEBUG屬性為true,默認為false
          • OPTIONS=[option,option...]: OPTION列表,也就是要啟動的模塊列表。

          在內置的start.config中默認的OPTIONS列表有:

          • All
          • Client
          • Server
          • ajp
          • annotations
          • client
          • default
          • deploy
          • ext
          • jmx
          • jndi
          • jsp
          • jta
          • monitor
          • overlay
          • overlays
          • plus
          • policy
          • resources
          • rewrite
          • security
          • server
          • servlet
          • servlets
          • setuid
          • webapp
          • websocket
          • xml

          configs

          jetty運行需要一些配置文件,這些配置文件對應于不同的OPTION所需要的配置。

          默認的jetty配置存在都存在于${jetty.home}/etc中,所有配置文件列表有:

          • etc/jetty-ajp.xml
          • etc/jetty-annotations.xml
          • etc/jetty-bio-ssl.xml
          • etc/jetty-bio.xml
          • etc/jetty-contexts.xml
          • etc/jetty-debug.xml
          • etc/jetty-deploy.xml
          • etc/jetty-fileserver.xml
          • etc/jetty-ipaccess.xml
          • etc/jetty-jmx.xml
          • etc/jetty-logging.xml
          • etc/jetty-monitor.xml
          • etc/jetty-overlay.xml
          • etc/jetty-plus.xml
          • etc/jetty-policy.xml
          • etc/jetty-proxy.xml
          • etc/jetty-requestlog.xml
          • etc/jetty-rewrite.xml
          • etc/jetty-ssl.xml
          • etc/jetty-stats.xml
          • etc/jetty-testrealm.xml
          • etc/jetty-webapps.xml
          • etc/jetty-xinetd.xml
          • etc/jetty.xml

          這么多配置,如何記得住?該使用哪些配置?

          下一個章節中介紹配置文件。


          參考資源:


          ©2009-2014 IMXYLZ |求賢若渴
          posted on 2012-03-28 19:02 imxylz 閱讀(28385) 評論(2)  編輯  收藏 所屬分類: Jetty

          評論

          # re: [深入淺出Jetty 04]Jetty的啟動方式 2012-03-30 07:50 tb
          恩 學習了   回復  更多評論
            


          ©2009-2014 IMXYLZ
          主站蜘蛛池模板: 龙口市| 曲麻莱县| 顺昌县| 门源| 同德县| 乌苏市| 宁国市| 新兴县| 芷江| 高尔夫| 延吉市| 平原县| 光山县| 遂宁市| 自贡市| 榕江县| 开鲁县| 博客| 大荔县| 怀化市| 桓台县| 阿克苏市| 鹤山市| 苏尼特右旗| 油尖旺区| 泾川县| 永新县| 道真| 漳州市| 彰化市| 万载县| 察雅县| 巫山县| 且末县| 滦平县| 平顺县| 无锡市| 滕州市| 商城县| 仙游县| 仙居县|