MyEclipse6Java开发中文教程 第十六章开发EJB应用 第十六章开发EJB应用 161介绍 16.1.1概述 1612 Java ee5技术简介 6.1.3 Java ee打包和发布 16131JAR文件 16.132WAR文件 16.1.33EAR文件 1614 Java ee开发中的角色划分 1615 JavaBean和EJB的区别 161.6EJB和 Spring能否共存 9000 162系统需求 163准备工作 1631 MyEclipse对EJB提供的开发支持 1631配置应用服务器 1632 JBoss服务器目录结构简介 164走进 Java ee:JND1 164.1JND简介…. 1642如何查看 JBoss服务器的JND树 3368 1643开发JND|应用 1643.1简单JND|开发 1643.2JND访问数据源 1643使用JND|进行DNS,邮件服务器,主机信息查找… 1644 JBoss/. Tomcat E的一个JND|Bug问题解决 41 165开发 Session bean 1651 Session bean简介 1652开发无状态 Session Bean 1653体验无状态Bean的混乱态 1654开发有状态 Session bean 1655EJB发布描述符和 JBOss jND|地址 65268 1655EJB互访问和资源注入 1656拦截器 1657EJB和Web服务 1658EJB最佳实践 166开发实体Bean 1651使用反向工程生成EJB3实体Bean 1652调整生成的配置文件和实体类… 1653编写并运行测试代 166消息驱动Bean 1661JMS简介… 刘长炯著
MyEclipse 6 Java 开发中文教程 1 刘长炯著 第十六章 开发 EJB 应用 第十六章 开发 EJB 应用 ................................................................................................. 1 16.1 介绍................................................................................................................... 2 16.1.1 概述......................................................................................................... 2 16.1.2 Java EE 5 技术简介 ................................................................................. 5 16.1.3 Java EE打包和发布.................................................................................. 7 16.1.3.1 JAR文件......................................................................................... 7 16.1.3.2 WAR 文件 ................................................................................... 16 16.1.3.3 EAR文件...................................................................................... 17 16.1.4 Java EE开发中的角色划分..................................................................... 19 16.1.5 JavaBean和EJB的区别.......................................................................... 20 16.1.6 EJB和Spring能否共存 ............................................................................ 20 16.2 系统需求.......................................................................................................... 20 16.3 准备工作.......................................................................................................... 20 16.3.1 MyEclipse对EJB提供的开发支持 ........................................................... 20 16.3.1 配置应用服务器..................................................................................... 21 16.3.2 JBoss服务器目录结构简介..................................................................... 21 16.4 走进Java EE:JNDI ........................................................................................ 23 16.4.1 JNDI简介................................................................................................ 23 16.4.2 如何查看 JBoss服务器的JNDI树 .......................................................... 26 16.4.3 开发JNDI应用........................................................................................ 28 16.4.3.1 简单JNDI开发.............................................................................. 28 16.4.3.2 JNDI访问数据源........................................................................... 34 16.4.3.3 使用 JNDI 进行DNS, 邮件服务器, 主机信息查找...................... 38 16.4.4 JBoss/Tomcat中的一个JNDI Bug问题解决 ..................................... 41 16.5 开发 Session Bean ......................................................................................... 41 16.5.1 Session Bean简介.................................................................................. 41 16.5.2 开发无状态Session Bean ...................................................................... 46 16.5.3 体验无状态Bean的混乱态 ..................................................................... 51 16.5.4 开发有状态 Session Bean .................................................................... 52 16.5.5 EJB发布描述符和JBoss JNDI 地址 ....................................................... 56 16.5.5 EJB互访问和资源注入............................................................................ 58 16.5.6 拦截器 ................................................................................................... 65 16.5.7 EJB 和 Web 服务................................................................................. 67 16.5.8 EJB最佳实践.......................................................................................... 69 16.6 开发实体Bean ................................................................................................. 70 16.5.1 使用反向工程生成 EJB 3 实体 Bean................................................... 70 16.5.2 调整生成的配置文件和实体类 ............................................................... 81 16.5.3 编写并运行测试代码.............................................................................. 81 16.6 消息驱动Bean ................................................................................................. 82 16.6.1 JMS简介 ................................................................................................ 82
MyEclipse6Java开发中文教程 16.62JMS编程模型 16.6.3JMS点对点模式编程. 1664JMS发布订阅模式编程 1665MDB简介及MDB编程 167可嵌入式的EJB引擎 168小结 104 169参考资料 16.10术语表 107 161介绍 注意:本章将会出现大量术语(英文缩写等),请您参考本章末尾的术语表 1611概述 本章将会简要介绍JNDl,EJB及其开发。随着轻量级框架的流行,EJB的开发相对不 如以前那样受到大家的重视,不过在某些场合,以及大公司和大企业例如银行,电信等机构 中,它的使用还是非常的广泛的。尤其在一些需要多台服务器集群的时候,还是离不开的。 这是因为 Spring等轻量级框架不提供对于分布式服务的攴持。那么什么是分布式服务呢 我们来举一个简单的例子,例如你承包了一片地,需要找人来开发。第一种办法呢,是你自 己去开发,来盖房子,当然这种方式呢会有间题,比如说你不是建筑方面的专家,没有学习 过相关的技术不会盖房子那怎么办呢?这时候呢,一般来说我们可以去委托给一些建筑队或 者是建筑公司,让他们来进行这些房子的设计和开发,并且根据实际情况,如果工程量比较 大,或者是进度要求比较快,我们呢,还可以联系多家建筑公司一块儿来进行开发。这些相 当于我们是客户端,而一个建筑公司呢是服务器,虽然有多家建筑公司,但是他们提供的服 务是标准化的服务,也就是都能够进行合乎标准的建筑服务,这样呢他们就相当于所谓的服 务器集群,我们作为客户端需要的就是提出建筑的具体要求(所谓的业务逻辑),其他的功 能由他们来提供。同时,因为他们提供保证符合标准前提下,又带有特色的服务,所以呢, 可以方便的在工程的中间阶段根据情况更换服务公司,这相当于更换服务器 简单回顾一下EJB的历史。EJB10出现于1997年,那时候中国人还没几个做Java 的,只可惜搞的太重量级了,开发比较困难,后来才有了轻量级的 Hibernate和 Spring。在 Hibernate之前还有好多其它的轻量级ORM框架,不过那也是在EJB推广之后的事情 了。有意思的发现EJB最早是旧BM的发明,参考:http:/zh.wikipediaorg/wiki/ejb.Ejb 最早于1997年由IBM提出,旋即被太阳微系统采用并形成标准(EJB1.0和EJB1.1)。在 EJB2.1和以前的版本中,每个EJB都由一个类和两个接口组成。EJB容器负责创建这个类 的实例 接口则供客户端调用 参考 htt/www.ibm.com/developerworks/cn/opensource/os-ag-renegade14/,勿庸置疑,1997 年推出的BM⑧原始EJB规范是Java技术领域最重要的开发成果之一。EJB和包含 EJB的J2EE应用服务器迅速地应用于企业开发。然而,对EJB的批评之声也正如J2EE 的采用一样快速涌至。在这些批评之中,最主要的抱怨是EJB难于理解且开发起来繁琐乏 EJB是一种服务器的组件体系结构,它简化了用java开发企业级的分布式组件应用程 2 刘长炯著
MyEclipse 6 Java 开发中文教程 2 刘长炯著 16.6.2 JMS编程模型 ......................................................................................... 86 16.6.3 JMS点对点模式编程............................................................................... 87 16.6.4 JMS 发布订阅模式编程 ......................................................................... 96 16.6.5 MDB简介及MDB编程............................................................................. 99 16.7 可嵌入式的EJB引擎 ...................................................................................... 103 16.8 小结................................................................................................................ 104 16.9 参考资料........................................................................................................ 106 16.10 术语表 .......................................................................................................... 107 16.1 介绍 注意:本章将会出现大量术语(英文缩写等),请您参考本章末尾的术语表。 16.1.1 概述 本章将会简要介绍 JNDI,EJB 及其开发。随着轻量级框架的流行,EJB 的开发相对不 如以前那样受到大家的重视,不过在某些场合,以及大公司和大企业例如银行,电信等机构 中,它的使用还是非常的广泛的。尤其在一些需要多台服务器集群的时候,还是离不开的。 这是因为 Spring 等轻量级框架不提供对于分布式服务的支持。那么什么是分布式服务呢? 我们来举一个简单的例子,例如你承包了一片地,需要找人来开发。第一种办法呢,是你自 己去开发,来盖房子,当然这种方式呢会有问题,比如说你不是建筑方面的专家,没有学习 过相关的技术不会盖房子那怎么办呢?这时候呢,一般来说我们可以去委托给一些建筑队或 者是建筑公司,让他们来进行这些房子的设计和开发,并且根据实际情况,如果工程量比较 大,或者是进度要求比较快,我们呢,还可以联系多家建筑公司一块儿来进行开发。这些相 当于我们是客户端,而一个建筑公司呢是服务器,虽然有多家建筑公司,但是他们提供的服 务是标准化的服务,也就是都能够进行合乎标准的建筑服务,这样呢他们就相当于所谓的服 务器集群,我们作为客户端需要的就是提出建筑的具体要求(所谓的业务逻辑),其他的功 能由他们来提供。同时,因为他们提供保证符合标准前提下,又带有特色的服务,所以呢, 可以方便的在工程的中间阶段根据情况更换服务公司,这相当于更换服务器。 简单回顾一下EJB的历史。EJB 1.0 出现于 1997 年,那时候中国人还没几个做 Java 的,只可惜搞的太重量级了,开发比较困难,后来才有了轻量级的 Hibernate和Spring。在 Hibernate 之前还有好多其它的轻量级 ORM 框架,不过那也是在 EJB 推广之后的事情 了。有意思的发现 EJB 最早是 IBM 的发明,参考: http://zh.wikipedia.org/wiki/EJB。EJB 最早于 1997 年由IBM提出,旋即被太阳微系统采用并形成标准(EJB 1.0 和EJB 1.1)。在 EJB 2.1 和以前的版本中,每个EJB都由一个类和两个接口组成。EJB容器负责创建这个类 的实例,接口则供客户端调用。 参考: http://www.ibm.com/developerworks/cn/opensource/os-ag-renegade14/ ,勿庸置疑,1997 年推出的 IBM® 原始 EJB 规范是 Java 技术领域最重要的开发成果之一。EJB 和包含 EJB 的 J2EE 应用服务器迅速地应用于企业开发。然而,对 EJB 的批评之声也正如 J2EE 的采用一样快速涌至。在这些批评之中,最主要的抱怨是 EJB 难于理解且开发起来繁琐乏 味。 EJB 是一种服务器的组件体系结构,它简化了用 java 开发企业级的分布式组件应用程
MyEclipse6Java开发中文教程 序的过程。通过EJB,我们能写出可扩展的、健壮的和安全的应用程序,而不用自己去写 复杂的分布式组件框架。EJB用于快速开发服务器端应用程序,通过利用由业界提供的 些事先写好的基础结构,我们可以快速而轻松的利用Java构建服务器端组件。EJB被设计 为支持应用程序的可移植性和八这些特性是适用于任何厂商的企业中间件服务的。应用服务 器一般是指这种提供EJB,JMS,安全,事务等多种服务的服务器,而其中一种属于EJB 容器;而 Servlet容器则一般只是提供JsP和 Servlet的功能,例如 Tomcat。图16.1列出 了传统的 Java ee应用的结构,包括客户机, Java ee服务器和数据库服务器。当然,没 有人规定必须将所有的技术都用上才算是一个 Java eE应用,目前基于轻量级开发的SSH 应用,其实也是一种基于Web容器的解决方案,离开了Web容器, Struts是运行不了的 Java EE Application 1 Java EE Application 2 Client lient Tiel Application Dynamic HTML Pages SP Pages Web Tier Java EE Server Enterprise Beans Enterprise BeansBusiness Tier EIS Tier Database Database Database 图161传统 Java ee应用的结构 然而,实际上的应用服务器提供了多种技术,包括:JND,LDAP, Javamail,JAF, JMS, JTA, Web H& % JAXB, JAXP, JAXR, JCA, JAX-WS, SAAJ, RMI-IIOP, EJB, JsP, Servlet,JAAs,JsF,JsTL, Portal,SoA,JPA,加密解密等等全套技术,而且 般会提供热发布,集群,管理控制台,性能监控,远程管理,各种各样的池(数据库连接 池,线程池,对象池)等服务。就目前市场上的 Java ee服务器来说,主流的仍然是国外 厂商的商业服务器(即收费版本,一般都是单cPU多少万的卖,比 MyEclipse这样的软件 要贵的多,如果你的公司用了盗版的,那么千万要小心),这些服务器有 BEA WebLogic ( WebLogic Express只提供Web层的服务), IBM WebSphere Application Server, Oracle Application Server等等。有人说开源的 JBoss也不错,实际上 JBoss提供付费版本,里面 的组件和免费版大不一样,安装包也大很多(商业版 JBoss安装包大概200多MB),而且 最要命的是 JBoss服务器的文档是收费的(开源版本没有带文档的)!不过目前Sun主导的 开源 Java EE服务器 GlassFish呼声很高,据说性能比较好(全部使用NO等技术实现)。 Web层的服务器,坦白说 Tomcat是性能比较低下的一个,即使开源的 Resin也比同样条 刘长炯著
MyEclipse 6 Java 开发中文教程 3 刘长炯著 序的过程。通过 EJB,我们能写出可扩展的、健壮的和安全的应用程序,而不用自己去写 复杂的分布式组件框架。EJB 用于快速开发服务器端应用程序,通过利用由业界提供的一 些事先写好的基础结构,我们可以快速而轻松的利用 Java 构建服务器端组件。EJB 被设计 为支持应用程序的可移植性和八这些特性是适用于任何厂商的企业中间件服务的。应用服务 器一般是指这种提供 EJB,JMS,安全,事务等多种服务的服务器,而其中一种属于 EJB 容器;而 Servlet 容器则一般只是提供 JSP 和 Servlet 的功能,例如 Tomcat。图 16.1 列出 了传统的 Java EE 应用的结构,包括客户机,Java EE 服务器和数据库服务器。当然,没 有人规定必须将所有的技术都用上才算是一个 Java EE 应用,目前基于轻量级开发的 SSH 应用,其实也是一种基于 Web 容器的解决方案,离开了 Web 容器,Struts 是运行不了的。 图 16.1 传统 Java EE 应用的结构 然而,实际上的应用服务器提供了多种技术,包括:JNDI,LDAP,JavaMail,JAF, JMS,JTA,Web 服务,JAXB,JAXP,JAXR,JCA,JAX-WS,SAAJ,RMI-IIOP,EJB, JSP,Servlet, JAAS,JSF,JSTL,Portal,SOA,JPA,加密解密等等全套技术,而且 一般会提供热发布,集群,管理控制台,性能监控,远程管理,各种各样的池(数据库连接 池,线程池,对象池)等服务。就目前市场上的 Java EE 服务器来说,主流的仍然是国外 厂商的商业服务器(即收费版本,一般都是单 CPU 多少万的卖,比 MyEclipse 这样的软件 要贵的多,如果你的公司用了盗版的,那么千万要小心),这些服务器有 BEA WebLogic (WebLogic Express 只提供 Web 层的服务),IBM WebSphere Application Server,Oracle Application Server 等等。有人说开源的 JBoss 也不错,实际上 JBoss 提供付费版本,里面 的组件和免费版大不一样,安装包也大很多(商业版 JBoss 安装包大概 200 多 MB),而且 最要命的是 JBoss 服务器的文档是收费的(开源版本没有带文档的)!不过目前 Sun 主导的 开源 Java EE 服务器 GlassFish 呼声很高,据说性能比较好(全部使用 NIO 等技术实现)。 Web 层的服务器,坦白说 Tomcat 是性能比较低下的一个,即使开源的 Resin 也比同样条
MyEclipse6Java开发中文教程 件下的 Tomcat允许速度要快得多(当然 Resin还有商业版,同时还支持EJB开发)。所以 在这里我不是想说开源的坏话,总的来说,开源的软件,总是有这样那样的问题,俗话说多 少钱,多少货,这个是的确不假的。另外,国产的软件,到现在也还是主要停留在应用层面 服务器级别的和国外的还是竞争不过的。其它开源的应用服务器还有 Apache Geronimo等 等,|BM的免费服务器版本 WebSphere Application Server Community Edition就是基于它 二次开发的。而JMs这个关键技术,做的比较好的也大多是商业的例如 BEA Tuxedo websphere MQ,开源的则有 Apache ActiveMQ,免费的有 Sun Java System Message Queue等。图162列出了 Java ee5技术架构图,图163列出了目前支持 Java ee5规 范的服务器列表,包括国产的金蝶服务器。 Http Web Contain EJB Conta Servlet EJB Applet J2SE Application Client J2SE J2SE Client 112 Database New in Java EE 5 图162 Java ee5技术架构图(灰蓝色部分为新增内容) Chea GERONIMO e Apache Geronimo-2. WebLogic Server v10.0 IBM WASCE 2.0 Kingdee ORACLE Apusic Application Oracle Application SAP NetWeaver 7.1 Server (v5.0) Server 11 ◆Smm max Soft Sun Java System Application Tmax Soft JEUS 6 GlassFish Application Server Server Platform Edition 9 图163支持 Java ee5规范的服务器 这样一来呢,进行 Java ee开发就有了两套解决方案。一套是商业的,包括用商业操 作系统十商业服务器硬件+商业服务器软件+商业数据库软件(典型的例如 Oracle,DB2 SQL Server),这套系统的特点是昂贵,不过,不管你是否承认,的确有效,尤其是对开发 刘长炯著
MyEclipse 6 Java 开发中文教程 4 刘长炯著 件下的 Tomcat 允许速度要快得多(当然 Resin 还有商业版,同时还支持 EJB 开发)。所以 在这里我不是想说开源的坏话,总的来说,开源的软件,总是有这样那样的问题,俗话说多 少钱,多少货,这个是的确不假的。另外,国产的软件,到现在也还是主要停留在应用层面, 服务器级别的和国外的还是竞争不过的。其它开源的应用服务器还有 Apache Geronimo 等 等,IBM 的免费服务器版本 WebSphere Application Server Community Edition 就是基于它 二次开发的。而 JMS 这个关键技术,做的比较好的也大多是商业的例如 BEA Tuxedo, Websphere MQ,开源的则有 Apache ActiveMQ,免费的有 Sun Java System Message Queue 等。图 16.2 列出了 Java EE 5 技术架构图,图 16.3 列出了目前支持 Java EE 5 规 范的服务器列表,包括国产的金蝶服务器。 图 16.2 Java EE 5 技术架构图(灰蓝色部分为新增内容) 图 16.3 支持 Java EE 5 规范的服务器 这样一来呢,进行 Java EE 开发就有了两套解决方案。一套是商业的,包括用商业操 作系统+商业服务器硬件+商业服务器软件+商业数据库软件(典型的例如 Oracle,DB2, SQL Server),这套系统的特点是昂贵,不过,不管你是否承认,的确有效,尤其是对开发
MyEclipse6Java开发中文教程 人员要求不高,国内的大企业,例如电信,银行,政府部门等(说实话,Java不能用于实 时操作的领域,这也是Sun的JDK下载里面说的很清楚的,所以一般都是提供外围接口服 务的部分,例如服务网站,内部网等等),总之是有钱的大客户,大多数会采用这种方案。 另一套是开源架构的,全部采用开源,不过问题也有,例如开源的SSH组合,往往一个地 方配置出错,整个应用都会坏掉,甚至还有因为开源包之间互相冲突造成问题,也不支持集 群,调优等功能,开发过程也比较缓慢。相对来说,JSF十JPA的开发效率要稍高于SSH 当然对于读者来说,到底用什么技术,是不能纯粹出于自己的喜好的,更多的是看单位的情 况和要求。总而言之,本书的内容个个章节都是按照参考资料的方式提供的,读者可以根据 项目需要来阅读。 由于 Java ee领域的技术点是如此之多,因此如果要全面的介绍,那么光是技术点的 内容就可以写一本千页的大书,例如我以前买过一本《J2EE编程指南13版》。所以在本书 中,我们不可能覆盖方方面面,本章,也主要集中于EJB3的内容上。EJB21的内容,读 者可以参考附录部分的 Mastering Enterprise JavaBeans Third Edition这本书(中文出版名 为《精通EJB》),那本书是EJB2的经典书籍,如果你看了那本书,就会发现仅仅是EJB 就可以讲述那么多的内容。当然,对于我们开发人员来说,主要目的就是写例子,发布,运 行即可。 1612 Java ee5技术简介 接下来我们对 Java ee技术进行简单的介绍 为何推出 Java ee5? Suts, Spring, Webwork, Hibernate等等开源框架的冲击 传统的EJB21及相关应用开发难度太大 开源ORM及 JBoss等服务器的冲击 开源框架缺乏稳定性和商业支持 简化ORM开发人员负担(多种ORM框架互不兼容) Java ee5有哪些新特性? 标注取代部署描述符 简化的EJB软件开发 使用依赖关系注入来访问资源 Java持久性AP1模型 Web服务 Java ee5大量采用标注简化开发,这种趋势已经影响到了很多开源框架例如 Struts2 ( Struts2也支持标注方式的 Action开发,并在开发完全无配置文件的版本)以及 Spring ( Spring25大力增强了对标注方式的开发支持)。标注取代部署描述符,可以用来进行: 定义和使用Web服务 开发EJB软件应用程序 将Java技术类映射到XML 将Java技术类映射到数据库 将方法映射到操作 指定外部依赖关系 指定部署信息,其中包括安全属性 标注格式 标注使用@字符来标记,例如下面的代码片段定义了一个无状态的会话Bean 刘长炯著
MyEclipse 6 Java 开发中文教程 5 刘长炯著 人员要求不高,国内的大企业,例如电信,银行,政府部门等(说实话,Java 不能用于实 时操作的领域,这也是 Sun 的 JDK 下载里面说的很清楚的,所以一般都是提供外围接口服 务的部分,例如服务网站,内部网等等),总之是有钱的大客户,大多数会采用这种方案。 另一套是开源架构的,全部采用开源,不过问题也有,例如开源的 SSH 组合,往往一个地 方配置出错,整个应用都会坏掉,甚至还有因为开源包之间互相冲突造成问题,也不支持集 群,调优等功能,开发过程也比较缓慢。相对来说,JSF+JPA 的开发效率要稍高于 SSH。 当然对于读者来说,到底用什么技术,是不能纯粹出于自己的喜好的,更多的是看单位的情 况和要求。总而言之,本书的内容个个章节都是按照参考资料的方式提供的,读者可以根据 项目需要来阅读。 由于 Java EE 领域的技术点是如此之多,因此如果要全面的介绍,那么光是技术点的 内容就可以写一本千页的大书,例如我以前买过一本《J2EE 编程指南 1.3 版》。所以在本书 中,我们不可能覆盖方方面面,本章,也主要集中于 EJB 3 的内容上。EJB 2.1 的内容,读 者可以参考附录部分的 Mastering Enterprise JavaBeans Third Edition 这本书(中文出版名 为《精通 EJB》),那本书是 EJB 2 的经典书籍,如果你看了那本书,就会发现仅仅是 EJB 就可以讲述那么多的内容。当然,对于我们开发人员来说,主要目的就是写例子,发布,运 行即可。 16.1.2 Java EE 5 技术简介 接下来我们对 Java EE 技术进行简单的介绍。 为何推出 Java EE 5? Struts, Spring, Webwork, Hibernate 等等开源框架的冲击 传统的 EJB 2.1 及相关应用开发难度太大 开源 ORM 及 JBoss 等服务器的冲击 开源框架缺乏稳定性和商业支持 简化 ORM 开发人员负担(多种 ORM 框架互不兼容) Java EE 5 有哪些新特性? 标注取代部署描述符 简化的 EJB 软件开发 使用依赖关系注入来访问资源 Java 持久性 API 模型 Web 服务 Java EE 5 大量采用标注简化开发,这种趋势已经影响到了很多开源框架例如 Struts 2 (Struts 2 也支持标注方式的 Action 开发,并在开发完全无配置文件的版本)以及 Spring (Spring 2.5 大力增强了对标注方式的开发支持)。标注取代部署描述符,可以用来进行: 定义和使用 Web 服务 开发 EJB 软件应用程序 将 Java 技术类映射到 XML 将 Java 技术类映射到数据库 将方法映射到操作 指定外部依赖关系 指定部署信息,其中包括安全属性 标注格式: 标注使用 @ 字符来标记,例如下面的代码片段定义了一个无状态的会话 Bean:
MyEclipse6Java开发中文教程 import javax. ejb @Stateless public class HelloWorldSessionBean implements mypackage. HelloWorldSessionLocal 简化了EJB软件开发。现在进行EJB的开发只需很少的类和接口您不再需要EJB组 件的Home接口和对象接口,因为现在容器负责公开必要的方法。您只需提供业务接口 您可以使用标注来声明EJB组件,并且通过容器来管理事务 不再需要部署描述符。您可以在类中直接使用标注,为容器提供以前在部署描述符中定 义的依赖关系和配置信息。如果没有任何特殊说明,容器将使用缺省规则来处理最常见的情 查找简单。您可以通过 EJBContext直接在类中查找JND|名称空间中的对象。 简化了对象关系映射。新的Java持久性AP|允许您使用POJO中的标注将Java 对象映射到关系数据库,从而使对象关系映射变得更简单透明 使用依赖关系注入来访问资源 对象可以使用标注直接请求外部资源 使用@ Resource标注或针对一些专用资源的@EJB和@ Web serviceRef标注 可以注入以下资源 Session Context对象 Data Sources对象 Entity Manager接口 其他 Enterprise Beans Web服务 消息队列和主题 资源适配器的连接工厂 Java持久性AP|模型 不仅用于 Java ee服务器环境,也可用于 Java se和Web层 无缝集成替换 Hibernate, TopLink等ORM框架 使用标注开发JDK5 or later)) 实体是POJO 标准化的对象关系映射 命名查询 简单的打包规则 分离的实体 Entity Manager API 实体是PoJO。与使用容器管理持久性( Container- Managed Persistence,cMP) 的EJB组件不同,使用新AP的实体对象不再是组件,并且它们不再需要位于EJB 模块中。 标准化的对象关系映射。新规范将对对象关系映射的处理方式进行标准化,从而使 开发者不再需要了解特定于供应商的策略。Java持久性AP|使用标注来指定对象关 系映射信息,但它仍支持XML描述符。 命名査询。现在命名査询是用元数据表示的静态查询。查询可以是Java持久性 AP查询或本地査询。这样会使重用查询变得非常简单。 简单的打包规则。由于实体Bean是简单的Java技术类,因此几乎可以在Java 刘长炯著
MyEclipse 6 Java 开发中文教程 6 刘长炯著 import javax.ejb.*; @Stateless public class HelloWorldSessionBean implements mypackage.HelloWorldSessionLocal { } 简化了 EJB 软件开发。现在进行 EJB 的开发只需很少的类和接口。您不再需要 EJB 组 件的 Home 接口和对象接口,因为现在容器负责公开必要的方法。您只需提供业务接口。 您可以使用标注来声明 EJB 组件,并且通过容器来管理事务。 不再需要部署描述符。您可以在类中直接使用标注,为容器提供以前在部署描述符中定 义的依赖关系和配置信息。如果没有任何特殊说明,容器将使用缺省规则来处理最常见的情 况。 查找简单。您可以通过 EJBContext 直接在类中查找 JNDI 名称空间中的对象。 简化了对象关系映射。新的 Java 持久性 API 允许您使用 POJO 中的标注将 Java 对象映射到关系数据库,从而使对象关系映射变得更简单透明。 使用依赖关系注入来访问资源: 对象可以使用标注直接请求外部资源 使用 @Resource 标注或针对一些专用资源的 @EJB 和 @WebServiceRef 标注 可以注入以下资源: SessionContext 对象 DataSources 对象 EntityManager 接口 其他 Enterprise Beans Web 服务 消息队列和主题 资源适配器的连接工厂 Java 持久性 API 模型 不仅用于 Java EE 服务器环境,也可用于 Java SE 和 Web 层 无缝集成/替换 Hibernate, TopLink 等 ORM 框架 使用标注开发(JDK 5 or later) 实体是 POJO 标准化的对象关系映射 命名查询 简单的打包规则 分离的实体 EntityManager API 实体是 POJO。与使用容器管理持久性 (Container-Managed Persistence, CMP) 的 EJB 组件不同,使用新 API 的实体对象不再是组件,并且它们不再需要位于 EJB 模块中。 标准化的对象关系映射。新规范将对对象关系映射的处理方式进行标准化,从而使 开发者不再需要了解特定于供应商的策略。Java 持久性 API 使用标注来指定对象关 系映射信息,但它仍支持 XML 描述符。 命名查询。现在命名查询是用元数据表示的静态查询。查询可以是 Java 持久性 API 查询或本地查询。这样会使重用查询变得非常简单。 简单的打包规则。由于实体 Bean 是简单的 Java 技术类,因此几乎可以在 Java
MyEclipse6Java开发中文教程 EE应用程序中的任意位置将其打包。例如,实体Bean可以是 EJB JAR、应用程序 客户端JAR、WEB-NFb、 WEB-INF/ classes的一部分,甚至是企业应用程序归档 Enterprise Application Archive,EAR)文件中实用程序JAR的一部分。通过这些简单 的打包规则,您不再需要创建EAR文件以使用来自Web应用程序或应用程序客户 端的实体Bean 分离的实体。由于实体Bean是POJO,因此可以对它们执行序列化,通过网络 将其发送到其他地址空间,并在不识别持久性的环境中使用它们。这样,您就不再需要 使用数据传输对象( Data Transfer Object,DTO Entity Manager API。现在,应用程序编程人员可以使用标准 Entity Manager API 来执行涉及实体的创建、读取、更新和删除( reate Read Update Delete,cRUD)操 作, Web服务 使用标注显著改进和简化了Web服务支持 JDK6直接内置简化对 Web service的支持 JAX-WS 2.0 JAX-WS20是 Java ee5平台中用于Web服务的新APl JA-Ws20保留了自然的RPC编程模型,同时在以下几个方面进行了改 进:数据绑定、协议和传输的独立性、对Web服务的REST样式的支持 以及易开发性。 异步Web服务 在轮询模型中,发出调用。准备就绪后,请求结果。 在回调模型中,注册处理程序。在响应到达后,立即向您发出通知。 关于Web服务的这些内容,我们已经在上一章做了探讨 1613 Java ee打包和发布 刚刚接触到 Java ee开发的读者,常常为Java中名目繁多的打包文件感到晕眩。常见 的有JAR,WAR,RAR,EAR,其实所有这些文件的格式都是ZP格式的,可以使用Wnz|P 或者 WinRAR等软件打开,当然也能用它们来创建。还可以用JDK自带的JAR工具或者 开发工具例如 Eclipse来创建JAR。 16131JAR文件 JAR文件, Java archive,Java档案文件。详细内容可以参考文末的资料JAR文件 揭密。JAR文件格式以流行的Z|P文件格式为基础,用于将许多个文件聚集为一个文件。 我们可以自己制作JAR文件,将编译输出的类文件按照包结构压缩即可。与ZP文件不同 的是,JAR文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可 被像编译器和JVM这样的工具直接使用。在JAR中包含特殊的文件,如 manifests和 部署描述符,用来指示工具如何处理特定的JAR。图164列出了一个常见的JAR文件的 目录结构 注意:JAR文件中的 META-INF目录(大小写不能错)不是必须的,但是大多数时候 还是加上为妙,因为笔者以前就发现在 Tomcat下以间ar文件的方式加入自己写的类的时候 没有加入此目录,结构 Tomcat竟然不识别自己写的类 刘长炯著
MyEclipse 6 Java 开发中文教程 7 刘长炯著 EE 应用程序中的任意位置将其打包。例如,实体 Bean 可以是 EJB JAR、应用程序 客户端 JAR、WEB-INF/lib、WEB-INF/classes 的一部分,甚至是企业应用程序归档 (Enterprise Application Archive, EAR) 文件中实用程序 JAR 的一部分。通过这些简单 的打包规则,您不再需要创建 EAR 文件以使用来自 Web 应用程序或应用程序客户 端的实体 Bean。 分离的实体。由于实体 Bean 是 POJO,因此可以对它们执行序列化,通过网络 将其发送到其他地址空间,并在不识别持久性的环境中使用它们。这样,您就不再需要 使用数据传输对象 (Data Transfer Object, DTO)。 EntityManager API。现在,应用程序编程人员可以使用标准 EntityManager API 来执行涉及实体的创建、读取、更新和删除 (Create Read Update Delete, CRUD) 操 作。 Web 服务 使用标注显著改进和简化了 Web 服务支持 JDK 6 直接内置/简化对 Web Service 的支持 JAX-WS 2.0 JAX-WS 2.0 是 Java EE 5 平台中用于 Web 服务的新 API。 JAX-WS 2.0 保留了自然的 RPC 编程模型,同时在以下几个方面进行了改 进:数据绑定、协议和传输的独立性、对 Web 服务的 REST 样式的支持 以及易开发性。 异步 Web 服务 在轮询模型中,发出调用。准备就绪后,请求结果。 在回调模型中,注册处理程序。在响应到达后,立即向您发出通知。 关于 Web 服务的这些内容,我们已经在上一章做了探讨。 16.1.3 Java EE 打包和发布 刚刚接触到 Java EE 开发的读者,常常为 Java 中名目繁多的打包文件感到晕眩。常见 的有 JAR,WAR,RAR,EAR,其实所有这些文件的格式都是 ZIP 格式的,可以使用 WinZIP 或者 WinRAR 等软件打开,当然也能用它们来创建。还可以用 JDK 自带的 JAR 工具或者 开发工具例如 Eclipse 来创建 JAR。 16.1.3.1 JAR 文件 JAR 文件,Java ARchive,Java 档案文件。详细内容可以参考文末的资料 JAR 文件 揭密。JAR 文件格式以流行的 ZIP 文件格式为基础,用于将许多个文件聚集为一个文件。 我们可以自己制作 JAR 文件,将编译输出的类文件按照包结构压缩即可。与 ZIP 文件不同 的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可 被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和 部署描述符,用来指示工具如何处理特定的 JAR。图 16.4 列出了一个常见的 JAR 文件的 目录结构。 注意:JAR 文件中的 META-INF 目录(大小写不能错)不是必须的,但是大多数时候 还是加上为妙,因为笔者以前就发现在 Tomcat 下以 jar 文件的方式加入自己写的类的时候, 没有加入此目录,结构 Tomcat 竟然不识别自己写的类
MyEclipse6Java开发中文教程 回国 commons1ein1.4. jar \META-IN-zP档案文件,解包大小为8156字节 a commons-logging1.0.4.jar 口 META-INF 目 LICENSE.txt 日 apache 目 NOTICE. txt MANIFEST MF -o logging 图164 ons Logging包的JAR文件结构 个JAR文件可以用于: 用于发布和使用类库 作为应用程序和扩展的构建单元 作为组件、 applet或者插件程序的部署单位 用于打包与组件相关联的辅助资源 AR文件格式提供了许多优势和功能,其中很多是传统的压缩格式如ZP或者TAR 所没有提供的。它们包括 安全性。可以对JAR文件内容加上数字化签名。这样,能够识别签名的工具就可 以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以检测代码是 否被篡改过。 减少下载时间。如果一个 applet捆绑到一个JAR文件中,那么浏览器就可以在 个HTTP事务中下载这个applet的类文件和相关的资源,而不是对每一个文件 打开一个新连接 压缩。JAR格式允许您压缩文件以提高存储效率 传输平台扩展。Java扩展框架( Java extensions framework)提供了向Java核心 平台添加功能的方法,这些扩展是用JAR文件打包的(Java3D和 JavaMail就是 由Sun开发的扩展例 包密封。存储在JAR文件中的包可以选择进行密封,以增强版本一致性和安全性。 密封一个包意味着包中的所有类都必须在同一JAR文件中找到。 包版本控制个JAR文件可以包含有关它所包含的文件的数据,如厂商和版本 信息 可移植性。处理JAR文件的机制是Java平台核心AP1的标准部分( java util. jar 包下面 META-NF目录 大多数JAR文件包含一个META-NF目录,它用于存储包和扩展的配置数据,如安 全性和版本信息。Java2平台识别并解释 META-INF目录中的下述文件和目录,以便配 置应用程序、扩展和类装载器 MANIFESTMF。这个 manifest文件定义了与扩展和包相关的数据。 NDEXLIST。这个文件由jar工具的新选项i生成,它包含在应用程序或者扩 展中定义的包的位置信息。它是 Jarlndex实现的一部分,并由类装载器用于加速 类装载过程 XXX, SF。这是JAR文件的签名文件。占位符ⅹxX标识了签名者 xxκ.DSA。与签名文件相关联的签名程序块文件,它存储了用于签名JAR文件的 公共签名。 刘长炯著
MyEclipse 6 Java 开发中文教程 8 刘长炯著 图 16.4 Commons Logging 包的 JAR 文件结构 一个 JAR 文件可以用于: • 用于发布和使用类库 • 作为应用程序和扩展的构建单元 • 作为组件、applet 或者插件程序的部署单位 • 用于打包与组件相关联的辅助资源 JAR 文件格式提供了许多优势和功能,其中很多是传统的压缩格式如 ZIP 或者 TAR 所没有提供的。它们包括: • 安全性。可以对 JAR 文件内容加上数字化签名。这样,能够识别签名的工具就可 以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以检测代码是 否被篡改过。 • 减少下载时间。 如果一个 applet 捆绑到一个 JAR 文件中,那么浏览器就可以在 一个 HTTP 事务中下载这个 applet 的类文件和相关的资源,而不是对每一个文件 打开一个新连接。 • 压缩。JAR 格式允许您压缩文件以提高存储效率。 • 传输平台扩展。 Java 扩展框架(Java Extensions Framework)提供了向 Java 核心 平台添加功能的方法,这些扩展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是 由 Sun 开发的扩展例子)。 • 包密封。存储在 JAR 文件中的包可以选择进行 密封,以增强版本一致性和安全性。 密封一个包意味着包中的所有类都必须在同一 JAR 文件中找到。 • 包版本控制。一个 JAR 文件可以包含有关它所包含的文件的数据,如厂商和版本 信息。 • 可移植性。处理 JAR 文件的机制是 Java 平台核心 API 的标准部分(java.util.jar 包下面)。 META-INF 目录 大多数 JAR 文件包含一个 META-INF 目录,它用于存储包和扩展的配置数据,如安 全性和版本信息。Java 2 平台识别并解释 META-INF 目录中的下述文件和目录,以便配 置应用程序、扩展和类装载器: • MANIFEST.MF。这个 manifest 文件定义了与扩展和包相关的数据。 • INDEX.LIST。 这个文件由 jar 工具的新选项 -i 生成,它包含在应用程序或者扩 展中定义的包的位置信息。它是 JarIndex 实现的一部分,并由类装载器用于加速 类装载过程。 • xxx.SF。 这是 JAR 文件的签名文件。占位符 xxx 标识了签名者。 • xxx.DSA。 与签名文件相关联的签名程序块文件,它存储了用于签名 JAR 文件的 公共签名
MyEclipse6Java开发中文教程 jar工具 为了用JAR文件执行基本的任务,要使用作为 Java Development Kit的一部分提供 的 Java archive tool(jar工具)。用jar命令调用jar工具。下表显示了一些常见的应用: 功能 命令 用一个单独的文件创建一个JAR文件 jar cf jar-file input-file 用一个目录创建一个JAR文件 jar cf jar-file dir-name 创建一个未压缩的JAR文件 jar cfo jar-file dir-name 更新一个JAR文件 jar uf jar-file input-file. 查看一个JAR文件的内容 jar tf jar-file 提取一个JAR文件的内容 jar xf jar-file 从一个JAR文件中提取特定的文件 jar xf jar-file archived-file 运行一个打包为可执行JAR文件的应用程序 Java -ar app. jar 可执行的JAR 个可执行的jar文件是一个自包含的Java应用程序,它存储在特别配置的JAR文件 中,可以由WM直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行 的JAR中的应用程序,必须将它加入到您的类路径中,并用名字调用应用程序的主类。但 是使用可执行的JAR文件,我们可以不用提取它或者知道主要入口点就可以运行一个应用 程序。可执行JAR有助于方便发布和执行Java应用程序 创建可执行JAR 创建一个可执行JAR很容易。首先将所有应用程序代码放到一个目录中。假设应用程序中 的主类是 com. mycompany. myapp. Sample。您要创建一个包含应用程序代码的JAR文 件并标识出主类。为此,在某个位置(不是在应用程序目录中)创建一个名为 manifest的文 件,并在其中加入以下一行 Main-Class: com mycompany. myapp. Sample 然后,像这样创建JAR文件 cmf manifest ExecutableJar jar application-dir 所要做的就是这些了-现在可以用 Java -ar执行这个JAR文件 EXecutableJar jar 个可执行的JAR必须通过 manifest文件的头引用它所需要的所有其他从属JAR。如 果使用了jar选项,那么环境变量 CLASSPATH和在命令行中指定的所有类路径都被 JWM所忽略 启动可执行JAR 既然我们已经将自己的应用程序打包到了一个名为 Executable Jar jar的可执行JAR中 了,那么我们就可以用下面的命令直接从文件启动这个应用程序 java -jar EXecutableJar jar 首先需要声明的是,并不是所有类型的Java应用程序都能打包到单独的一个JAR 文件中去。必须符合一定的条件,一个Java应用程序的所有文件才能打包到一个文件 中去。另外,JAR文件有两种,一种是有清单( manifest)文件的,一种是没有清单文件 的(这种主要用来存放Java库文件)。清单文件有许多作用,我这里只讨论那种可以使用 Java来运行JAR文件的清单文件。就是使用命令 java -jar MyJarFile」ar 刘长炯著
MyEclipse 6 Java 开发中文教程 9 刘长炯著 jar 工具 为了用 JAR 文件执行基本的任务,要使用作为 Java Development Kit 的一部分提供 的 Java Archive Tool ( jar 工具)。用 jar 命令调用 jar 工具。下表显示了一些常见的应用: 功能 命令 用一个单独的文件创建一个 JAR 文件 jar cf jar-file input-file... 用一个目录创建一个 JAR 文件 jar cf jar-file dir-name 创建一个未压缩的 JAR 文件 jar cf0 jar-file dir-name 更新一个 JAR 文件 jar uf jar-file input-file... 查看一个 JAR 文件的内容 jar tf jar-file 提取一个 JAR 文件的内容 jar xf jar-file 从一个 JAR 文件中提取特定的文件 jar xf jar-file archived-file... 运行一个打包为可执行 JAR 文件的应用程序 java -jar app.jar 可执行的 JAR 一个 可执行的 jar 文件是一个自包含的 Java 应用程序,它存储在特别配置的 JAR 文件 中,可以由 JVM 直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行 的 JAR 中的应用程序,必须将它加入到您的类路径中,并用名字调用应用程序的主类。但 是使用可执行的 JAR 文件,我们可以不用提取它或者知道主要入口点就可以运行一个应用 程序。可执行 JAR 有助于方便发布和执行 Java 应用程序。 创建可执行 JAR 创建一个可执行 JAR 很容易。首先将所有应用程序代码放到一个目录中。假设应用程序中 的主类是 com.mycompany.myapp.Sample 。您要创建一个包含应用程序代码的 JAR 文 件并标识出主类。为此,在某个位置(不是在应用程序目录中)创建一个名为 manifest 的文 件,并在其中加入以下一行: Main-Class: com.mycompany.myapp.Sample 然后,像这样创建 JAR 文件: jar cmf manifest ExecutableJar.jar application-dir 所要做的就是这些了 -- 现在可以用 java -jar 执行这个 JAR 文件 ExecutableJar.jar。 一个可执行的 JAR 必须通过 menifest 文件的头引用它所需要的所有其他从属 JAR。如 果使用了 -jar 选项,那么环境变量 CLASSPATH 和在命令行中指定的所有类路径都被 JVM 所忽略。 启动可执行 JAR 既然我们已经将自己的应用程序打包到了一个名为 ExecutableJar.jar 的可执行 JAR 中 了,那么我们就可以用下面的命令直接从文件启动这个应用程序: java -jar ExecutableJar.jar 首先需要声明的是, 并不是所有类型的 Java 应用程序都能打包到单独的一个 JAR 文件中去。 必须符合一定的条件, 一个 Java 应用程序的所有文件才能打包到一个文件 中去。 另外, JAR 文件有两种, 一种是有清单(manifest)文件的, 一种是没有清单文件 的(这种主要用来存放 Java 库文件)。 清单文件有许多作用, 我这里只讨论那种可以使用 Java 来运行 JAR 文件的清单文件。 就是使用命令 java -jar MyJarFile.jar
MyEclipse6Java开发中文教程 可以直接运行的JAR文件。这种JAR文件的清单文件的内容如下所示 Manifest-Version: 1.0 Main-Class: Main File Created-By: Your Co 。例如,假定你的程序里面的主程序是 com abc. MainFrame,那么你的这个清单文件 的内容是: Manifest-Version: 1.0 Main-Class: com. abc. Main Frame Created-By: Abc Company 然后我想讨论一下打包到单独JAR文件的应用程序的编写需要注意的问题 程序的资源文件(如gf,·jpg,‘jpeg,* properties等等)不能使用物理路径,只 能使用相对于当前类文件的相对资源路径,只有这样才能保证打包以后程序才能找到这些 资源文件。那么,这些文件在打开的时候都要使用下列语句 URL url getClasso. getResource(String name 或者 InputStream in= getclasso getResourceAs Stream( String name) 。例如 javax swing. Imagelcon icon= new javax. swing. Imagelcon( 1. gif) 那么打包后的程序将不能找到这个图片,因为它引用了一个物理路径的图片,它应该改成 这样: javax. swing. Imagelcon new javax. swing. Imagelcon(getclasso. getResource (1.gif)) 。其它的资源文件的使用也与此相似。不过属性文件( properties)的使用,Java自动会 加载JAR文件中的属性文件,例如 Resource Bundle. getBundle(com. abc test) 那么,这个文件只要放在JAR文件目录结构下的 com/abc/test properties,Java就能 自动找到这个文件 接着我想讨论一下使用JAR工具如何来创建JAR文件,这个工具可以在 bin下找到,文件名在Wn32版下为 Jar. exe,Unix下为jar.在 命令行窗口下输入jar命令,将看到下列输出: 用法:jar{ ctxulvfmOM][ar-文件[ manifest文件[C目录]文件名 选项 -c创建新的归档 列出归档内容的列表 -X展开归档中的命名的(或所有的)文件 u更新己存在的归档 V生成详细输出到标准输出上 -f指定归档文件名 -m包含来自指定的清单( manifest)文件的清单( manifest)信息 0只存储方式;未用ZP压缩格式 刘长炯著
MyEclipse 6 Java 开发中文教程 10 刘长炯著 可以直接运行的 JAR 文件。 这种 JAR 文件的清单文件的内容如下所示: Manifest-Version: 1.0 Main-Class: MainClassFile Created-By: Your Company 。 例如, 假定你的程序里面的主程序是 com.abc.MainFrame, 那么你的这个清单文件 的内容是: Manifest-Version: 1.0 Main-Class: com.abc.MainFrame Created-By: Abc Company 。 然后我想讨论一下打包到单独 JAR 文件的应用程序的编写需要注意的问题。 程序的资源文件(如*.gif, *.jpg, *.jpeg, *.properties 等等)不能使用物理路径, 只 能使用相对于当前类文件的相对资源路径, 只有这样才能保证打包以后程序才能找到这些 资源文件。 那么, 这些文件在打开的时候都要使用下列语句: URL url = getClass().getResource(String name); 或者 InputStream in = getClass().getResourceAsStream(String name); 。 例如: javax.swing.ImageIcon icon = new javax.swing.ImageIcon("1.gif"); 那么打包后的程序将不能找到这个图片, 因为它引用了一个物理路径的图片, 它应该改成 这样: javax.swing.ImageIcon icon = new javax.swing.ImageIcon(getClass().getResource("1.gif")); 。 其它的资源文件的使用也与此相似。 不过属性文件(*.properties)的使用, Java 自动会 加载 JAR 文件中的属性文件, 例如: ResourceBundle.getBundle("com.abc.test"); 那么, 这个文件只要放在 JAR 文件目录结构下的 com/abc/test.properties, Java 就能 自动找到这个文件。 接着我想讨论一下使用 JAR 工具如何来创建 JAR 文件, 这个工具可以在 /bin 下找到, 文件名在 Win32 版下为 jar.exe, Unix 下为 jar. 在 命令行窗口下输入 jar 命令, 将看到下列输出: 用法:jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ... 选项: -c 创建新的归档 -t 列出归档内容的列表 -x 展开归档中的命名的(或所有的〕文件 -u 更新已存在的归档 -v 生成详细输出到标准输出上 -f 指定归档文件名 -m 包含来自指定的清单(manifest〕文件的清单(manifest〕信息 -0 只存储方式;未用 ZIP 压缩格式