关于ant打包应用程序(整理)

来源:互联网 发布:linux需要网卡驱动 编辑:程序博客网 时间:2024/06/05 17:15

要发布EJB 时必须把她打成*.jar 文件,一个EJB 打包后的目录结构如下:

EJB 应用根目录| -- com (你的.class 文件)| -- META-INF       | -- MANIFEST.MF (如果使用工具打包,该文件由工具自动生成)


打包的方式有很多,如:jar 命令行、集成开发环境的打包向导和Ant 任务。下面介绍Elispse 打包向导和Ant 打
包任务。
1. Elispse 打包向导
在Elispse 开发环境下,可以通过向导进行打包。右击项目名称,在跳出的菜单中选择“导出”,在“导出”对话
框选择“Jar 文件”,在“选择要导出的资源”时,选择源目录和用到的资源。然后选择一个存放目录及文件名。

点“完成”就结束了打包。

2. Ant 打包任务

采用Ant 进行打包是比较方便的,也是作者推荐的打包方式。下面我们看一个简单的打包任务。

<?xml version="1.0"?><project name="jartest" default="jar" basedir="."><property name="build.dir" value="${basedir}/build" /><property name="build.classes.dir" value="${build.dir}/classes" /><target name="jar" description="打包成Jar"><jar jarfile="${basedir}/ejbfile.jar"><fileset dir="${build.classes.dir}"><include name="**/*.class" /></fileset><metainf dir="${basedir}/META-INF "><include name="**" /></metainf></jar></target></project>

上面建立了一个名为jartest 的Ant 项目,默认的任务为default="jar",项目的路径为build.xml 文件所在目录
basedir="." 。应用编绎过后的class 文件已经存在于应用的/build/classes/目录下。Ant 定义了一个属性
“build.classes.dir”,他指向应用的/build/classes/目录。
<target name="jar" description="打包成Jar">定义了一个名叫jar 的任务,description 是描述信息。任务中使用jar
命令把/build/classes/目录下的所有class 文件打包进jar 文件,同时也把应用下的META-INF 目录下的所有文件打

包进jar 文件的META-INF 目录。打包后的jar 文件存放在应用目录下。文件名为:ejbfile.jar

如何进行WEB 应用打包

WEB 应用根目录
| -- **/*. jsp| -- WEB-INF     | -- web.xml     | -- lib        | -- *.*     | -- classes         | -- **/*.class

1.在命令行下用jar 命令进行war 文件打包
在打包前把文件存成上面的目录结构:
在Dos 窗口中进入到WEB 应用根目录下,执行如下命令
jar cvf EJBTest.war *
此命令把WEB 应用根目录下的所有文件及文件夹打包成EJBTest.war 文件

例如WEB 应用根目录在: D:\java\webapp\ ,命令输入如下:

D:\java\webapp> jar cvf EJBTest.war *
2.在Ant 任务中进行war 文件打包

如果文件存放的结构如下面所示:

WEB 应用根目录    |-- build.xml   |--**/*.jsp   |-- WEB-INF        | -- web.xml        | -- lib           | -- *.*        | -- classes             | -- **/*.class

那么Ant 的war 文件打包任务如下:

<target name="war" description="创建WEB 发布包"> 定义一个名叫war 的任务。任务中执行war 打包操作,
在war 节点中,通过webxml 指明web.xml 的位置, 通过<classes dir="${basedir}/WEB-INF/classes">指明web
的classes 目录位置,通过<lib dir="${basedir}/WEB-INF/lib">指明web 的lib 目录位置,通过<webinf

dir="${basedir}/WEB-INF">指明web 的WEB-INF 目录位置。如何进行企业应用打包

如何进行企业应用打包

一个完整的企业应用包含EJB 模块和WEB 模块,在发布企业应用时,我们需要把它打成*.ear 文件,在打包前我
们必须配置application.xml 文件,该文件存放于打包后的META-INF 目录。我们在application.xml 文件中需要指

定EJB 模块和WEB 模块的信息,一个application.xml 配置例子如下:

<application xmlns="http://java.sun.com/xml/ns/j2ee" version="1.4"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/application_1_4.xsd"><display-name>EJB3 Sample Application</display-name><module><web><web-uri>web.war</web-uri><context-root>web</context-root></web></module><module><ejb>ejb3.jar</ejb></module></application>

上面<web>指定Web 模块,<ejb>指定EJB 模块,Web 模块或者EJB 模块都可以存在多个。
不管你使用何种方式打包,一个企业应用打包后的目录结构应该如下:

ear 应用根目录    | -- ejb3.jar (你的EJB 模块)    | -- web.war (你的WEB 模块)    | -- META-INF          | -- MANIFEST.MF (如果使用工具打包,该文件由工具自动生成)          | -- application.xml

使用了第三方类库的EJB 如何打包

在实际项目中,我们经常需要使用第三方的类库。这些类库应该放在哪里?EJB 应用一般都有被“卸出”(这里
指装入的反向过程)的能力,这种能力由部署时装入它们的类装载器支持。如果我们把第三方类库放入应用服务
器的标准类路径([jboss 安装目录]\server\default\lib),这些类很可能完全失去被卸出的能力。这样,如果EJB 应
用要更新某个第三方类库的版本,重新部署EJB 应用时,第三方类库也要重新部署。在这种情形下,把第三方类
库放入应用服务器标准类路径很不方便,因为每次部署EJB 应用时,都要重新启动整个应用服务器,这显然不是
理想的选择。适合放入应用服务器类路径的第三方类库通常是一些通用类库,如JDBC 驱动。
对于针对特定应用的第三方类库,最理想的选择是把他们放入EJB Jar 文件中。每一个JAR 文件里都有一个
manifest 文件,这个文件由jar 工具自动创建,默认名字是MANIFEST.MF。我们可以在manifest 文件中加入一个
Class-Path 属性,引用它所依赖的JAR 文件。我们可以手工编辑manifest.mf 文件,在原有内容的基础上,添加
Class-Path 属性。Class-Path 属性的值是用来搜索第三方类库的相对URL。这个URL 总是相对于包含Class-Path
属性的组件。单个Class-Path 属性内可以指定多个URL,一个manifest 文件可以包含多个Class-Path 属性。

假设本例EJB 使用了两个第三方类库,名为:Upload.jar,Socket.jar,修改后的manifest.mf 文件内容如下:

Manifest-Version: 1.0Ant-Version: Apache Ant 1.6.5Created-By: 1.5.0_01-b08 (Sun Microsystems Inc.)Class-Path: Upload.jar Socket.jar

注意:Class-Path: 与Upload.jar 之间有一空格分隔(缺少了空格就会发生找不到jar 文件),多个jar 文件之间需
要用空格分隔。Class-Path 所在行还需要进行回车换行。

下面是打完包后的目录结构:

EJB 应用根目录    | -- com (注:ejb 类包)    | -- Upload.jar (注:第三方类库)    | -- Socket.jar (注:第三方类库)    | -- META-INF       | -- MANIFEST.MF (注:加入了Class-Path 属性)

共用了第三方类库的J2EE 应用如何打包

一个J2EE 项目通常由多个EJB 和Web 应用构成,如果多个EJB 及Web 应用共用了一个第三方类库,我们又如
何打包呢?按照上节介绍的内容,我们会把第三方类库打进每个EJB Jar 文件及放在Web 应用的/WEB-INF/lib 目
录下。虽然这种方案也能解决问题,但它明显地不够完善。封装JAR 文件的目的是为了提高应用的模块化程度,
把同一个类库放入多个JAR 文件正好是背其道而行之。此外,多次放置同一个类库无谓地加大了应用的体积。最
后,即使只改变一个类库的版权,每一个EJB JAR 文件也都要重新构造,从而使构造过程复杂化。
下面的方案很好地解决了上面的问题
假设一个J2EE 项目含有两个EJB 及一个Web 应用,他们的文件名分别为:HelloWorld.jar,HelloChina.jar,
MyEJBTest.war。这三个模块都使用了一个第三方类库,名为:Tools.jar
现在我们要做的是编辑这三个模块的manifest.mf 文件,在原有内容的基础上,添加Class-Path 属性。

三个模块的jar 文件修改后的manifest.mf 文件内容如下:

Manifest-Version: 1.0Ant-Version: Apache Ant 1.6.5Created-By: 1.5.0_01-b08 (Sun Microsystems Inc.)Class-Path: Tools.jar

注意:Class-Path: 与Tools.jar 之间有一空格分隔(缺少了空格就会发生找不到jar 文件),Class-Path 所在行还需
要进行回车换行。
各个模块通过manifest.mf 文件都能找到其所依赖的Tools.jar 文件。

下面是打完包后的目录结构:

J2EE 应用根目录  | -- HelloWorld.jar     | -- META-INF        | -- MANIFEST.MF (注:加入了Class-Path 属性, 引用它所依赖的Tools.jar)  | -- HelloChina.jar     | -- META-INF        | -- MANIFEST.MF (注:加入了Class-Path 属性, 引用它所依赖的Tools.jar)  | -- MyEJBTest.war    | -- META-INF      | -- MANIFEST.MF (注:加入了Class-Path 属性, 引用它所依赖的Tools.jar)  | -- Tools.jar (注:第三方类库)    | -- META-INF      | -- application.xml      | -- MANIFEST.MF (注:由工具自动生成,没有加入Class-Path 属性)

把第三方类库和EJB 模块并排打进jar 包,如果第三方类库很多的情况下,显的有些零乱而不雅观。在此建议大家建个文件夹专门用来存放第三方类库。如建个lib 文件夹,把第三方类库放在此文件夹下。然后修改J2EE各模块的manifest.mf 文件内容,修改后的内容如下:


Manifest-Version: 1.0Ant-Version: Apache Ant 1.6.5Created-By: 1.5.0_01-b08 (Sun Microsystems Inc.)Class-Path: lib/Tools.jar

J2EE 应用的文件后缀为ear, 应用使用到的各模块在application.xml 文件中定义,本例的application.xml 内容如下:

<?xml version="1.0" encoding="UTF-8"?><application xmlns="http://java.sun.com/xml/ns/j2ee" version="1.4"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com /xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/application_1_4.xsd"><display-name>EJB3Trail</display-name><description>J2EE Made Easy Trail Map</description><module><ejb>HelloWorld.jar</ejb></module><module><ejb> HelloChina.jar</ejb></module><module><web><web-uri>MyEJBTest.war</web-uri><context-root>MyEJBTest</context-root></web></module></application>


因为EJB 打进了EAR 文件,在访问EJB 时,JNDI 名应为以下格式:
访问本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
访问远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
例:如果上面J2EE 应用打成MyJ2EE.ear 文件,访问HelloWorld EJB 远程接口的JNDI 名是:
MyJ2EE/HelloWorldBean/remote





原创粉丝点击