1.4 Jersey项目概要

Jersey是JAX-RS标准的参考实现,是Java领域中最纯正的REST服务开发框架。本节将带读者走近Jersey的世界。

Jersey项目是GlashFish项目的一个子项目,专门用来实现JAX-RS(JSR 311 & JSR 339)标准,并提供了扩展特性。

1.4.1 获得Jersey

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

1.4.2 Jersey问答

StackOverflow是专业的程序员问答系统,Jersey的问题列表地址是:http://stackoverflow.com/questions/tagged/jersey。该链接在Jersey官网首页底部被列出,可见Jersey对问答系统的重视。另外,邮件列表也是一种知识共享的途径,读者可以自行订阅,地址是:https://jersey.java.net/mailing.html

1.4.3 Jersey项目管理

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)。

1.4.4 Jersey许可

开发者使用开源软件的前提是了解它的许可证版本,否则可能会带来侵权问题。相信在正规的公司,大家都有被开发管理部门的人“恐吓”的经历。开发者需感谢这样的团队所做的工作,他们为公司规避了商业侵权的风险,因为引用的源代码如果出自“传染性”许可,该项目是不能用于闭源的商业用途的。

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实现的任何应用程序从该许可要求中排除。类路径例外就实现了这一目的。

1.4.5 Jersey的模块

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。

1.4.6 GlashFish项目

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、JSR067/SAAJ1.3。项目地址为https://metro.java.net。Metro项目中的多个标准作用各有不同。

• JAX-WS标准结合了XML-RPC,使用SOAP协议来实现Web Service。在JAXWS的实现中,不可不提的另外两个实现分别是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版本号可以取区间值之和而不是在最新版本号上顺延。