jetty 安裝及使用(linux)配置jvm


jetty 安裝及使用(linux)

標簽: 

雜談

分類: Java技術
 Jetty的首頁地址是 http://www.mortbay.org/jetty/,點擊 Downloads進入下載介紹頁面,由於Jetty7之后,托管服務有Eclipse接替,所以jetty6.1之前(包含6.1)繼續由Codehaus提供下載服務,在該頁面的下方有如下信息:
    

 

 

版本 Java HTTP Servlet JSP Status Notes
Jetty-8 eclipse 1.6- HTTP/1.1 RFC2616 3.0 2.2 Development Standardized async
Jetty-7 eclipse 1.5- HTTP/1.1 RFC2616 2.5 2.1 Almost stable org.eclipse.jetty
Jetty-6.1 1.4-1.6 HTTP/1.1 RFC2616 2.5 2.1 or 2.0 Stable Async SSL, AJP, cometd, testing
Jetty-6 1.4-1.5 HTTP/1.1 RFC2616 2.5 2.1 or 2.0 Deprecated Continuations, IOC, NIO, dynamic buffers, smaller, faster, better
Jetty-5.1 1.2-1.5 HTTP/1.1 RFC2616 2.4 2.0 Stable J2EE 1.4 Compliance tested, optimizations, geronimo integration.
Jetty-5.0 1.2-1.4 HTTP/1.1 RFC2616 2.4 2.0 Deprecated Schema, JettyPlus
Jetty-4.2 1.2-1.4 HTTP/1.1 RFC2616 2.3+ 1.2 Mature JettyPlus
Jetty-4.1 1.2-1.4 HTTP/1.1 RFC2616 2.3 1.2 Deprecated JAXP1.1, AJP13(mod_jk)
Jetty-4.0 1.2 HTTP/1.1 RFC2616 2.3 1.2 Deprecated  
Jetty-3.1 1.2 HTTP/1.1 RFC2068 2.2 1.1 Ancient JMX
Jetty-3.0 1.2 HTTP/1.1 RFC2068 2.2 1.1 Fossilized  
Jetty-2.4 1.1 HTTP/1.0 RFC1945 2.1 1.0 Legendary  
Jetty-1.0 1.0 HTTP/1.0 RFC1945 - - Mythical  

 


 

 
 本書討論的Jetty版本是6.1,也是目前使用最多的穩定版本,我們到 http://dist.codehaus.org/jetty/jetty-6.1.22/下載6.1系列最新的6.1.22版本:
 
jetty-6.1.22-src.zip  16-Nov-2009 23:04 5.7M
jetty-6.1.22.zip  16-Nov-2009 23:10 24M
 
    我們下載24M大小的jetty-6.1.22.zip文件,另外一個文件有5M是因為只包含了Jetty源碼和實例源碼,jetty-6.1.22.zip文件包包含了 api文檔,實例代碼、jetty源碼、發行Jar文件、各操作系統下的啟動腳本和其他部分依賴包。也許你會有疑問,我之前介紹Jetty的時候說Jetty體積非常小,是的沒錯!Jetty核心文件的大小只有約700K!
 
 

2.2 安裝

    要運行Jetty的首要條件當然是需要安裝JDK了,建議使用j2se 1.5以上的版本,關於JDK或者JRE的安裝,為了環保這里就不再花費篇章介紹了,請參考其他網絡資料。
    
    其實Jetty所謂的安裝過程也就是將下載的文件解壓到指定的目錄,然后根據不同的操作系統來配置環境變量而已。
 
   以后講解如何從maven源碼編譯等。

2.3 使用java命令啟動

    只要在支持j2se的平台的操作系統下,jetty都可以運行。所以我們先介紹jetty提供的跨平台的服務啟動方式。

2.3.1 快速啟動

     打開控制台,定位到jetty的安裝目錄,執行命令:            
        
java -jar start.jar etc/jetty.xml
提示:關於如何執行java的jar文件請查找其他資料。
 
    start.jar 后面內容是傳遞給start.jar的參數,多個參數用空格隔開。
 
參數內容可以有以下幾種:
  1. --help    查看幫助信息
  2. --stop    停止服務,下節中會講到
  3. --version  查看當前jetty版本信息
  4. 其他:作為Jetty服務配置文件
 

    我們看到上條命令指定參數內容為etc/jetty.xml,它實際指向一個服務配置文件,該文件是用來設置jetty服務啟動的系統配置信息。比如監聽端口,發布某個目錄下面的web應用,jndi的配置等等,這些將在后續章節詳細描述。當然服務配置文件可以是多個,比如:

 
java -jar start.jar etc/jetty.xml etc/jetty-plus.xml
   這條命令就指定了兩個 服務配置文件,etc/jetty.xml和etc/jetty-plus.xml。
 
    在后續的章節中術語“ 服務配置文件”就是指的這些文件。
   
    使用瀏覽器打開地址 http://localhost:8080/ ,你將會看到jetty的默認示例站點。
 

2.3.2 停止服務

    在剛才啟動jetty的終端窗口里面按住ctrl-c鍵即可。
 
    不過你可以這樣來啟動
 
java -DSTOP.PORT=8009 -DSTOP.KEY=secret -jar start.jar
     
    jetty啟動后會在本地監聽你指定的端口8009,並將在驗證下次關閉命令的密碼secret。現在再通過命令:
 
java -DSTOP.PORT=8009 -DSTOP.KEY=secret -jar start.jar --stop 
 
    就可以在本機的另外一個終端窗口來停止jetty服務。在linux系統中,你可以先將jetty進程轉移到后台執行,然后再通過命令行來停止Jetty服務。
 
    哦,看了上面的介紹你或許以為jetty啟動和關閉是如此麻煩,一點也不符合Jetty小巧玲瓏的氣質。其實Jetty為我們准備了各個操作系統中快捷的方式。不過記住不管何種方式最終都是通過start.jar來啟動jetty服務的。
 

2.3.3 start.jar深入探討

     初學者可以先跳過本節。本節討論start.jar模塊的作用和細節。start.jar讓jetty各個不同的組件聯合起來工作,使得jetty看上去像一個服務器軟件,同時start.jar也不過是jetty的其中一個組件而已。了解start.jar工作原理后,我們就可以知道#jetty_home/lib下面那么多文件夾下面的jar文件是如何配被選擇性地加入到classpath中去的。
 
    Jetty start 組件提供了跨平台的啟動方式。 通過啟動命令 java -DDEBUG=true -jar start.jar [jetty.xml ... ] 可以看到啟動過程的debug日志信息。
 
    看看Jetty start 在啟動過程中都做了哪些操作:
        
  1. 自動設置正確的 jetty home目錄
  2. 根據JDK版本配置classpath,比如jdk1.5版本之前的版本只能使用jsp2.0規范所需的jar包
  3. 根據設定的classpath,構建好一個類加載器。再根據設定的main class來調用指定main class的main方法
    由此可見start組件是相當獨立的組件,甚至我們可以在自己的項目里面單獨使用該組件控制程序的啟動。
 

    start.config語法

    Jetty start是由一個名叫start.config的配置文件控制的,這個文件存在在start.jar里面,路徑是org/mortbay/start/start.config。熟悉這個配置文件的內容會對jetty作為服務器的啟動過程有更好的了解。最重要的是我們知道jetty的classpath的設置和如何通過設置系統變量來把外部類路徑增加到jetty中。
 
    start.config的格式是每一行一條指令,如果以#開頭則為注解行。指令的后面是執行條件,如果條件不符合則忽略。
    指令有如下幾種情況:
  • 以.path結尾: 如果.path前面的字符串存在且長度大於0,則將該類路徑加入到系統類路徑中
  • 包含 “=”  :   執行System.setProperty(property,value)調用,“=”左邊為property,右邊為value
  • 以.class結尾:如果".class"前面有值的話,就設定為Main class
  • 以.xml結尾:  如果指定的xml文件存在的話就作為jetty服務的啟動配置文件之一
  • 以/*結尾:    指定目錄下面的所以jar或者zip文件,被加入到classpath中
  • 以/**結尾:  指定遞歸該目錄下面的所以jar或者zip文件,被加入到classpath中
  • 以/結尾:     指定的目錄作為classpath的一部分
  • 其他:         作為一個文件加入到classpath中
    關於條件:
  • "<",">"," <=",">=","==","!=" 是條件的比較操作符,從左到右執行
  • exists 檢測緊跟着后面的文件是否存在
  • available 檢測緊跟着后面的class是否存在
  • !表示非;always表示true
  • 變量nargs表示傳遞給start.jar的參數數量
  • 變量java表示java版本
    其他規則:
  • 所有的指令按行從上到下執行
  • 如果一個文件或者目錄由於條件被否決,沒有被加入到類路徑中,那么即使后續指令中包含了該文件或者目錄,那么同樣不會被加入到類路徑中
  • 指令或者條件中, $(...) 表示獲取系統屬性,即一次System.getProperty()調用。如$(jetty.class.path).path指令,當系統屬性“jetty.class.path”沒有設置,那么運行時實際指令的值位 “.path”。如果設置系統屬性“jetty.class.path”的值為"/usr/local/jarlib",那么運行時實際指令值為 "/usr/local/jarlib.path"
 
start.config文件
$(jetty.class.path).path                         always
$(jetty.lib)/**                                  exists $(jetty.lib)
 
 
# Try different settings of jetty.home until the jetty.jar is found.
jetty.home=.                                     ! exists $(jetty.home)/start.jar 
jetty.home=..                                    ! exists $(jetty.home)/start.jar
jetty.home=/home/jetty                           ! exists $(jetty.home)/start.jar
jetty.home=/C:/jetty                             ! exists $(jetty.home)/start.jar
jetty.home=.                                     ! exists $(jetty.home)/start.jar 
 
# The main class to run
org.mortbay.xml.XmlConfiguration.class
$(start.class).class
 
# The default configuration files
$(jetty.home)/etc/jetty.xml                      nargs == 0
 
# Set the jetty classpath
$(jetty.home)/lib/*                              always
 
# Set the classpath for the supporting cast               
$(jetty.home)/lib/jsp-2.1/*                      java >= 1.5   
$(jetty.home)/lib/jsp-2.0/*                      ! available org.apache.jasper.servlet.JspServlet               
$(jetty.home)/lib/management/*       
$(jetty.home)/lib/management/mx4j/*              java < 1.5           
$(jetty.home)/lib/naming/*                              
$(jetty.home)/lib/plus/*                             
$(jetty.home)/lib/xbean/*                             
$(jetty.home)/lib/wadi/*                             
$(jetty.home)/lib/grizzly/*                             
$(jetty.home)/lib/annotations/*                  java >= 1.5                            
 
$(jetty.home)/lib/jre1.5/**                      java >= 1.5
 
# Recursively add all jars and zips from the ext lib
$(jetty.home)/lib/ext/**                        always
 
# Try some standard locations for anything missing.
/usr/share/java/ant.jar                          ! available org.apache.tools.ant.Main
 
# Add a resources directory if it is there
$(jetty.home)/resources/
    

2.4我們可以學到什么

 
 

2.5 Windows系統下啟動和關閉控制

    
    jetty利用Win32Wrapper工具( http://wrapper.tanukisoftware.org)使得在window系統上可以以控制台或者Window服務的方式運行jetty程序,使用起來非常方便。
   
    在 $jetty_home/bin目錄下有如下幾個相關文件:Jetty-Service.exe , jetty-service.conf。雙擊Jetty-Service.exe 文件,即可以控制台的方式來運行jetty了。jetty-service.conf 顯然是配置文件了,一會詳細介紹。
 
     (以后我們用 $jetty_home來表示Jetty的安裝目錄)

    

  注冊Windows服務
        打開命令行,轉到 $jetty_home/bin 目錄,執行命令:
        
        E:\jetty-6.1.22\bin>Jetty-Service.exe --install jetty-service.conf
        wrapper  | Jetty6-Service installed.
 
  啟動服務
        執行命令: Jetty-Service.exe --start jetty-service.conf 
  停止服務
         執行命令:Jetty-Service.exe --stop jetty-service.conf 
  注銷服務
         執行命令:Jetty-Service.exe --remove jetty-service.conf 
 
    
    你在成功注冊Windows服務后,可以修改服務讓其隨系統自動啟動。
 
jetty-service.conf 配置文件

wrapper.java.classpath.1=../lib/win32/*.jar               

wrapper.java.classpath.2=../lib/*.jar
wrapper.java.classpath.3=../start.jar
wrapper.java.library.path.1=../lib/win32/
#wrapper.java.additional.n可以設置jvm參數
wrapper.java.additional.1=-Djetty.home=../            #設置系統屬性jetty.home,指定jetty根目錄
wrapper.java.additional.2=-Djetty.logs=../logs         #設置系統屬性jetty.logs
wrapper.java.initmemory=3                                  #jvm初始內存大小
wrapper.java.maxmemory=64                                #jvm內存大小
wrapper.java.mainclass=org.mortbay.jetty.win32service.JettyServiceWrapperListener
#wrapper.app.parameter.n可以設置應用程序參數,及 -jar start.jar 后面的參數
#例如 wrapper.app.parameter.1=../etc/jetty.xml ../etc/jetty-ajp.xml
wrapper.app.parameter.1=../etc/jetty.xml
wrapper.console.format=PM
wrapper.console.loglevel=INFO
wrapper.logfile=../logs/jetty-service.log           #輸出到System.out到內容將同時被記錄在該文件
wrapper.logfile.format=LPTM
wrapper.logfile.loglevel=INFO
wrapper.logfile.maxsize=0                           #jetty-service.log文件的最大尺寸,0表示不限制
wrapper.logfile.maxfiles=0                           #當限制文件大小時,允許存在的最多文件個數
wrapper.syslog.loglevel=NONE
wrapper.ntservice.name=Jetty
wrapper.ntservice.displayname=Jetty6-Service
wrapper.ntservice.description=Jetty is an open-source, standards-based, full-featured web server implemented entirely in java
wrapper.ntservice.starttype=AUTO_START
wrapper.ntservice.interactive=false
 
#Win32Wrapper中定義一個觸發器,當控制拋出OutOfMemoryError錯誤,則重啟Jetty服務
wrapper.filter.trigger.1=java.lang.OutOfMemoryError  
wrapper.filter.action.1=RESTART
 

2.6 Linux系統下啟動和關閉控制

     在$jetty_home/bin目錄下,Jetty為我們提供了一個名為jetty.sh的shell腳本文件,在linux環境下我們用這命令 ./jetty.sh start 和 .jetty.sh stop 命令來啟動和關閉jetty。jetty.sh在啟動Jetty后,將jvm的系統進程ID保存在一個$JETTY_RUN/jetty.pid的文件里面,然后在收到stop命令后讀取pid來關閉相應進程。
     在jetty.sh里面還可以定制變量來控制jetty,如指定JAVA_HOME目錄、指定jvm最大內存、指定pid文件的位置等。

2.6.1 系統變量的設置

提示:在編輯變量的時候“=”兩邊千萬不要有空格。
 
下面逐個介紹各變量的作用:
 

JAVA_HOME    

    指定Java安裝目錄。當你需要指定特定位置的jdk或者jetty搜索不到java安裝目錄時,需要設定該變量。
例如:    JAVA_HOME=/usr/local/java/jdk1.5.0_10/
 

JAVA

     執行java命令。默認值為 $JAVA_HOME/bin/java。一般不需要設置。
 

JAVA_OPTIONS

    JVM的可選參數。你可以利用這個選項配置內存大小、系統變量等等其他參數,這個變量非常有用。
 
例如:JAVA_OPTIONS="-Xmn128M -Xms256M -Xmx1024M 
-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider"
 

JETTY_RUN

    jetty.pid文件的存放目錄。默認值為 /var/run, /usr/var/run  或 /tmp 三者之一。如果你需要在一台服務器上啟動多個安裝目錄下的jetty,那么必須設定該變量以避免共享同一pid文件而造成沖突。建議設置為各個安裝目錄下面新建的run目錄。
 

JETTY_PID

    pid文件的路徑。默認值 $JETTY_RUN/jetty.pid。一般不需要設置。
 

JETTY_ARGS

    傳遞給jetty的參數。值 java -jar start.jar 后面的部分。
 

JETTY_HOME

    jetty安裝目錄。雖然jetty嘗試搜索jetty安裝目錄,但是我們還是建議設定該變量。
例如:
    JETTY_HOME=/usr/local/jetty-6.1.22
 
    在啟動java時增加jvm 參數 “-Djetty.home=$JETTY_HOME” 。所以在Linux環境下,start.jar的自動搜索jetty_home的動作會被取消。
 

JETTY_USER

    如設定該值,那么將以該用戶的身份啟動jetty
 

JETTY_PORT

    jetty服務器監聽端口。如果設定該值,那么在啟動java時增加jvm 參數 “-Djetty.port=$JETTY_PORT” 。
    在 jetty 啟動配置文件里,<Set name="Port"><SystemProperty name="jetty.port" default="8080"/></Set>這個語句將會使用我們這里指定的端口值。
 

2.6.2 命令參數

    系統控制台中,跳轉到 $jetty_home/bin目錄下,輸入“  ./jetty.sh start”,其中start為命令參數,現在介紹幾個常用命令參數
    

start    

    啟動jetty服務

 

stop    

    停止jetty服務

restart 

    重啟jetty服務

supervise    

 

    掛起服務

 
check   
 
     顯示當前jetty實例運行時所使用的變量參數,可以用來查看變量是否設置正確。
顯示結果實例:
node-189 bin # ./jetty.sh check
Checking arguments to Jetty:
JETTY_HOME     =  /usr/local/jetty-6.1.15
JETTY_CONF     =
JETTY_RUN      =  /var/run
JETTY_PID      =  /var/run/jetty.pid
JETTY_PORT     =
JETTY_LOGS     =
CONFIGS        =  /usr/local/jetty-6.1.15/etc/jetty-logging.xml /usr/local/jetty-6.1.15/etc/jetty.xml
JAVA_OPTIONS   =   -Djetty.home=/usr/local/jetty-6.1.15 -Djava.io.tmpdir=/tmp
JAVA           =  /usr/local/java/jdk1.5.0_10/bin/java
CLASSPATH      =  /usr/local/java/jdk1.5.0_10/lib:/usr/local/java/jdk1.5.0_10/jre/lib
RUN_CMD        =  /usr/local/java/jdk1.5.0_10/bin/java  -Djetty.home=/usr/local/jetty-6.1.15 -Djava.io.tmpdir=/tmp -jar /usr/local/jetty-6.1.15/start.jar  /usr/local/jetty-6.1.15/etc/jetty-logging.xml /usr/local/jetty-6.1.15/etc/jetty.xml
 
Jetty running pid=24573
 
 

2.6.3 相關配置文件

 

/etc/jetty.conf

    如果該文件存在,那么該文件的內容會被解析用來設定jetty  啟動配置文件(configurations),規則如下:
 
  • 以“#”開頭:該行內容作為注解
  • 指向一個文件的路徑:如果該文件存在則作為jetty啟動的一個啟動配置文件
  • 指向一個目錄的路徑:如果該目錄存在,則目錄下的所有.xml的文件會被作為啟動配置文件

 

    如果不存在該文件,jetty.sh將會使用默認值 :

“ ${JETTY_HOME}/etc/jetty-logging.xml ${JETTY_HOME}/etc/jetty.xml ”

 

/etc/default/jetty 、/etc/default/jetty6 和 $HOME/.jettyrc

    若任何一個文件存在,那么jetty.sh文件執行時都會執行它。我們可以在這些文件中配置系統變量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM