<b>1.4 jersey項目概要</b>
jersey是jax-rs标準的參考實作,是java領域中最純正的rest服務開發架構。本節将帶讀者走近jersey的世界。
jersey項目是glashfish項目的一個子項目,專門用來實作jax-rs(jsr 311 & jsr 339)标準,并提供了擴充特性。
<b>1.4.1 獲得jersey</b>
jersey項目的位址是https://jersey.java.net。該網站同時提供了jax-rs和jax-rs2兩個并行版本,分别是jax-rs1.1(截至本書發稿,最新版本是jersey1.19)和jax-rs2(截至本書發稿,最新版本是jersey2.22.1)。讀者可以通過單擊latest
jersey user guide擷取和閱讀最新版本的使用者手冊,這是官方釋出的第一手參考資料。
jersey項目的下載下傳位址http://jersey.java.net/download.html。該頁面自上而下的内容分别如下。
jax-rs标準清單連結(jax-rs 2.0 api)。
jersey最新參考實作的jar包下載下傳(jersey
jax-rs 2.0 ri bundle)。
jersey最新參考實作的示例代碼下載下傳(jersey
2.22.1 examples bundle)。
通過maven模闆(archetype),使用jersey最新版本建立rest服務的指令。
jersey最新參考實作的子產品和依賴(jersey 2
modules and dependencies)。
jax-rs1.1的參考實作包下載下傳。
jersey源代碼的托管位址是https://github.com/jersey/jersey,我們可以通過git指令,将jersey主幹代碼遷出到本地。示例如下。
git clone
https://github.com/jersey/jersey.git
<b>1.4.2 jersey問答</b>
stackoverflow是專業的程式員問答系統,jersey的問題清單位址是:http://stackoverflow.com/questions/tagged/jersey。該連結在jersey官網首頁底部被列出,可見jersey對問答系統的重視。另外,郵件清單也是一種知識共享的途徑,讀者可以自行訂閱,位址是:https://jersey.java.net/mailing.html。
<b>1.4.3 jersey項目管理</b>
jersey使用jira作為項目管理平台,相應的位址是:https://java.net/jira/browse/jersey。jira和stackoverflow不同的是,jira平台是jersey團隊日常開發的管理平台,即jersey官方的缺陷管理平台,用于上報缺陷和改進意見,而不是社群性質的交流平台。通過這個平台我們可以從中了解到jersey項目的進展情況。jersey是一個非常活躍的項目,不僅可以從github源代碼的送出活動中看到該項目頻繁的更新,在jira中也可以看到該項目推進的速度。
這裡為喜歡開源社群活動的讀者舉個例子。在撰寫本書第1版的開始,jersey2.0并不支援與spring的內建,因為jersey的ioc容器由glashfish的另一個子項目hk2來支援。随後,我在jira上發現一個jersey2.x支援與spring內建的任務被建立了(https://java.net/jira/browse/jersey-1957),此後我經常觀察其進展狀态,最終看到了這個功能在jersey2.2中以擴充包的形式釋出了。
是以,在使用jersey的過程中,如果讀者遇到jersey本身的問題,可以跟蹤jersey的jira平台檢索、檢視bug的修複狀态,包括将在哪個版本修複,有什麼樣的臨時解決辦法(workaround)。同時,跟蹤jira也可以了解新版本的釋出情況,包括新增哪些功能,更新對哪一部分帶來性能、安全的提升等。換句話說,jira展示了jersey項目的缺陷修複和新功能發版的計劃(roadmap)。
<b>1.4.4 jersey許可</b>
開發者使用開源軟體的前提是了解它的許可證版本,否則可能會帶來侵權問題。相信在正規的公司,大家都有被開發管理部門的人“恐吓”的經曆。開發者需感謝這樣的團隊所做的工作,他們為公司規避了商業侵權的風險,因為引用的源代碼如果出自“傳染性”許可,該項目是不能用于閉源的商業用途的。
jersey的許可證說明位址是:https://jersey.java.net/license.html。從中我們可以了解到jersey使用的是雙許可證:cddl(common
development and distribution license,開源通用開發和分發許可證)1.1和gplv2(類路徑例外)許可證。雙重許可是依照兩套(或更多套)不同的條款和條件分發相同軟體的作法。在為軟體授予雙重許可時,接收人可以選擇他們希望依照哪種條款獲得軟體。使用雙重許可的兩個常見動機是遵循商業模式和保持許可證相容性。gplv2.0許可證為無法依照cddl許可證使用jersey的供應商提供了一個額外選項。jersey許可證使整套産品和包保持一緻(glassfish項目同樣依照cddl和gplv2(類路徑例外)授予雙重許可)。
閱讀指南
類路徑例外是由自由軟體基金會的gnu/類路徑項目制訂的。它允許将依照任何許可證提供的應用程式連結到依照gplv2許可的軟體中包含的庫,而該應用程式不受gpl要求公開其本身的限制。
為什麼需要使用類路徑例外?因為作為“基于gpl程式的作品”的一部分提供的所有代碼還應獲得gpl許可。是以,需要指定gpl許可證例外的情況,以便明确将連結到gpl實作的任何應用程式從該許可要求中排除。類路徑例外就實作了這一目的。
<b>1.4.5 jersey的子產品</b>
jersey架構是由核心子產品、容器子產品、連接配接器子產品、media子產品、擴充子產品、測試架構子產品、安全子產品以及glassfish bundle子產品等8個大的子產品組成。詳情請讀者浏覽官方文檔:https://jersey.java.net/documentation/latest/modules-and-dependencies.html。
jersey核心子產品包括3個子子產品,分别是通用包、伺服器端實作包和用戶端實作包。jersey提供了3種http容器,分别是grizzly2、jdk-http和simple-http,grizzly2同時提供了servlet容器。jersey用戶端底層依賴于連接配接器來實作網絡通信,如果标準的用戶端子產品功能不能滿足業務需求,讀者可以考慮引入grizzly連接配接器包或者apache連接配接器包。
jersey在2.6版本做了一次包重構,清除了對guava和asm的自然依賴。如果你的項目需要做jersey版本遷移,則需要注意這一點。新的包名為:jersey.repackaged.com.google.common和
jersey.repackaged.objectweb.asm。
<b>1.4.6 glashfish項目</b>
glashfish項目位址為https://glassfish.java.net。glashfish著名于世的是java ee伺服器項目oracle
glassfish server,該項目還同時包含java ee中的一系列标準規範的參考實作,這些參考實作內建于glashfish server,為其java ee容器提供支援。其中對應jax-rs2的實作項目是jersey。
為什麼要在jax-rs2的介紹中提及和羅列glashfish項目集呢?因為jersey處于glashfish生态環境中,glashfish又是java ee生态環境的參考實作。通過了解glashfish項目,我們可以更好地設計和實作rest服務。
這裡所列的項目是除jersey以外,其他的glashfish項目,排列順序并不嚴謹,大體上以其與jersey的緊密關系降序排列。
hk2項目:jsr-330參考實作,項目位址為http://hk2.java.net。hk2是輕量級di架構,實作ioc和di的核心。是jersey實作容器内管理bean的基礎。
grizzly項目:中文直譯為灰熊。jsr-356參考實作,項目位址為https://grizzly.java.net。grizzly是一個異步io的、高效而健壯的伺服器,可以被用作http伺服器、servlet容器,支援ajp、comet、websocket以及相對于restful的另一種web service實作(jax-ws)。
eclipselink項目:該項目實作了多個jsr标準,包括jsr-338/jpa2.1、jsr-222/jaxb2.2、jsr-235/sdo2.1.1、jsr-353/java
api for processing json。項目位址為http://www.eclipse.org/eclipselink。eclipselink是jpa2.1的一個實作,同時它還實作了其他的jsr作為擴充。jpa2.1是java ee 7的成員,是對jsr317(jpa2.0)的更新。jpa2.1的實作中,最常用的是jboss的hibernate,該項目從4.3開始實作jpa2.1。也就是說hibernate4.2是jpa2.0的最後一個版本。讀者在開發的時候要注意依賴項目版本對标準的支援。jpa标準還有其他的實作,請參考http://en.wikipedia.org/wiki/java_persistence_api。
metro項目:該項目是jsr中多個标準的官方實作集,目的是實作全棧式的web service。包括jsr-224/jax-ws 2.2、jsr-222/jaxb2.2、jsr-206/jaxp 1.4.6、jsr-067/saaj1.3。項目位址為https://metro.java.net。metro項目中的多個标準作用各有不同。
jax-ws标準結合了xml-rpc,使用soap協定來實作web
service。在jax-ws的實作中,不可不提的另外兩個實作分别是apache的cxf和axis。
wsit的前身是tango,是一種jax-ws和.net互操作的技術,實作了ws*标準。
saaj規範的作用是基于soap協定xml格式傳遞帶附件的soap消息。
jaxp标準涵蓋了java對xml過程式處理的諸多技術,包括dom、sax和stax,同時該标準定義了解讀xml樣式的xslt。
jaxb标準是java處理xml和pojo映射的技術,是jersey中處理傳輸資料的重要依賴。
open mq項目:位址https://mq.java.net。open mq是jms 2.0的參考實作。jsr-343是java ee 7的成員,旨在簡化jms的api。關于消息隊列的實作數量,恐怕是其他任何一個标準都望塵莫及的。幾乎每一個有能力開發伺服器軟體、中間件的公司都有自己的mq,請參考http://en.wikipedia.org/wiki/message_queue。
mojarra項目:jsr-344/jsf2參考實作,項目位址為https://javaserverfaces.java.net。jsf是一種全棧式的、事件驅動的b/s開發模式架構,它包括浏覽器端的豐富元件,伺服器端覆寫java ee的各種特性。jsf相對于spring,借鑒了其核心思想ioc和aop,同時給出了标準規範。這有點類似jpa借鑒了hibernate的o/r mapping思想并标準化。jsf的另一個實作是apache的myfaces,目前版本為2.0.18。另外,jboss的richfaces是基于jsf的擴充中最為完善和常用的。更多有關jsf的内容和原理,請參考筆者的拙作《jsf2和richfaces4使用指南》。
openjdk項目:項目位址為http://openjdk.java.net。openjdk是開源的jdk,從版本1.7開始成為官方jdk的先行版本,是以是java開發者窺探java發展的第一線的最好資源,同時也是活躍的linux發行版本ubuntu和fedora等預設安裝的jdk版本。
目前使用的jdk版本号的更新規則是從jdk5.0釋出開始的,java更新釋出一直采用兩種方式釋出更新。
有限更新(limited update)包含新功能和非安全修正。
重要更新檔更新(critical patch update,cpu)隻包含安全修正。
有限更新發行序号為20的倍數,即一個偶數;重要更新檔更新順延上一個cpu的版本号加5的倍數并取奇數(必要時加1)。
舉例來說,下一個有限更新的版本号為7u40,那麼接下來的3個cpu版本号依次為40+5=7u45,45+5+1=7u51和51+5=7u55。再下一個有限更新的版本号為7u60,随後的cpu版本号依次為7u65、7u71和7u75。
這種命名規則會為重要更新檔更新保留幾個版本序号,以便新的cpu版本号可以取區間值之和而不是在最新版本号上順延。