您的位置:首页 > 其它

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

2011-09-10 09:43 148 查看
要发布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/j2ee http://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.0
Ant-Version: Apache Ant 1.6.5
Created-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.0
Ant-Version: Apache Ant 1.6.5
Created-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.0
Ant-Version: Apache Ant 1.6.5
Created-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/j2ee http://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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: