第 14 章 AutoExpand工具使用指南

14.1. AutoExpand工具简介
14.1.1. Java、JavaEE打包的格式
14.1.2. 应用部署的方式
14.1.3. AutoExpand的用武之地
14.2. AutoExpand的使用
14.2.1. 取得AutoExpand
14.2.2. 执行AutoExpand
14.2.3. AutoExpand和AutoConfig的合作
14.3. AutoExpand的参数
14.4. 本章总结

14.1. AutoExpand工具简介

AutoExpand是一个小工具,可以快速地把应用包展开到目录中。

14.1.1. Java、JavaEE打包的格式

Java和JavaEE的应用通常被打成一个ZIP格式的包。

表 14.1. 标准的Java、JavaEE包的格式

包类型说明
jarJava ARchive。共享类库,EJB,独立应用。
warWeb application ARchive。WEB应用。
earEnterprise ARchive。企业级应用。
rarResource Adapter Archive。

其中jar和war包是当今最常用的格式。其次还有ear。

  • Ear包中可以包含多个jar包(包括ejb-jar包)、rar包、war包。

  • War包中可以包含多个jar包。

例 14.1. 包的内部格式

下面是一个典型的ear包的内部格式:

myapp.ear
 │  foo-ejb.jar            // 内嵌ejb-jar包。
 │  bar.jar                // 内嵌普通jar包。
 │  myweb.war              // 内嵌war包。
 │
 └─META-INF
       application.xml     // EAR描述文件。

下面是一个典型的war包的内部格式:

myweb.war
 │  index.jsp
 │
 ├─images
 ├─META-INF
 └─WEB-INF
    │  web.xml             // WAR描述文件。
    │
    ├─classes
    │     foo.class        // Java类文件。
    │
    └─lib
          bar.jar          // 内嵌jar包。
          baz.jar

14.1.2. 应用部署的方式

多数应用服务器都支持两种类型的部署方式:以包的形式部署,或者以展开目录的形式部署。

表 14.2. 部署应用的方法

方法用途
以包的形式部署

你可以把WEB应用的war包直接发布在应用服务器上,应用服务器不需要把包打开就能运行它。

发布一个应用包(只有一个文件),对于deployer来说是比较方便的。通常他只需要把这个包往指定的应用服务器目录一丢,就可以把应用跑起来。

但是以包形式发布的应用不太好调试,因为你为了修改包中的任何一个文件,都必须重新打包。这是很费时的工作。

以展开目录的形式部署以展开目录的形式部署的应用,更适合于开发阶段。这样,开发者可以方便地替换应用中的任何一个文件,而不需要重新打包。这节省了很多时间。

14.1.3. AutoExpand的用武之地

AutoExpand的功能就是把包文件展开到文件夹中。

事实上,对于多数情况来说,用AutoExpand来展开一个包,和直接使用jar命令来展开包是没有差别的。例如,展开一个war包,可以用下面两种方法:

例 14.2. 用AutoExpand展开一个war包

$ autoexpand myweb.war 
Detected system charset encoding: UTF-8
If your can't read the following text, specify correct one like this: 
  autoexpand -c mycharset

Expanding: /.../myweb.war
       To: /.../myweb
done.

总耗费时间:762毫秒

例 14.3. 用jar命令展开一个war包

$ mkdir myweb
$ cd myweb
$ jar xvf ../myweb.war
  创建:META-INF/
  解压 META-INF/MANIFEST.MF
  ...

但是使用AutoExpand有如下好处:

  • 可展开嵌套的包,例如:一个ear中包含war包,用AutoExpand可以一举把它们同时展开。

  • 支持更多选项,例如:更新、覆盖、删除多余文件等。

  • jar命令速度更快。

14.2. AutoExpand的使用

14.2.1. 取得AutoExpand

请参考第 13.4.1.1 节 “取得可执行文件”

14.2.2. 执行AutoExpand

直接输入autoexpand可得到如下帮助信息。

例 14.4. AutoExpand的帮助信息

$ autoexpand
Detected system charset encoding: UTF-8
If your can't read the following text, specify correct one like this: 
  autoexpand -c mycharset

使用方法:antxexpand [可选参数] 文件名 [目标目录]
                
可选参数:
 -c,--charset                 输入/输出编码字符集
 -e,--expand-ejb-jar          是否展开ejb-jar(yes|no),默认为no
 -h,--help                    显示帮助信息
 -k,--keep-redundant-files    如果目标目录中有多余的文件,是否保持而不删除,默认为no
 -o,--overwrite               如果目标目录中的文件比zip文件中的项要新,是否覆盖之,默认为no
 -r,--expand-rar              是否展开rar(yes|no),默认为yes
 -v,--verbose                 显示更多信息
 -w,--expand-war              是否展开war(yes|no),默认为yes

总耗费时间:203毫秒

最简单的AutoExpand命令如下:

例 14.5. 最简单的AutoExpand命令

autoexpand myweb.war

这条命令将myweb.war展开到myweb目录中。

你也可以指定一个输出目录:

例 14.6. 执行AutoExpand命令:指定输出目录

autoexpand myweb.war myweb-expanded.war

这条命令将myweb.war展开到myweb-expanded.war目录中。在目录名中指定后缀(如.war)是一个好主意。这样,同一个名称(*.war)既可作为目录名,也可作为包名。你可以在目录和包文件之间自由地切换,而不需要改动服务器的脚本或配置。

你可以用一条命令展开嵌套的包。例如:

例 14.7. 执行AutoExpand命令:展开嵌套的包

autoexpand myapp.ear myapp-expanded.ear

这条命令可以一举把ear以及ear中的所有war都展开。

例 14.8. 展开ear以及ear中的所有war

myapp-expanded.ear
│  foo-ejb.jar
│  bar.jar
│
├─myweb.war        // 展开嵌套的war
│  │  index.jsp
│  │
│  ├─images
│  ├─META-INF
│  └─WEB-INF
│     │  web.xml
│     │
│     ├─classes
│     │     foo.class
│     │
│     └─lib
│           bar.jar
│           baz.jar
│
└─META-INF
      application.xml

14.2.3. AutoExpand和AutoConfig的合作

你可以让AutoConfig maven插件在配置完应用以后,将应用展开到指定的目录。

例 14.9. AutoConfig完成后,再用AutoExpand展开

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    ...
    <properties>
        ...
        <!-- 定义autoconfig的版本,建议将此行写在parent pom.xml中。 -->
        <autoconfig-plugin-version>1.2</autoconfig-plugin-version>
    </properties>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>com.alibaba.citrus.tool</groupId>
                <artifactId>autoconfig-maven-plugin</artifactId>
                <version>${autoconfig-plugin-version}</version>
                <configuration>
                    ...
                    <!-- 配置后,是否展开目标文件,默认为false,不展开。 -->
                    <exploding>true</exploding>
                    <!-- 展开到指定目录,默认为${project.build.directory}/${project.build.finalName}。 -->
                    <explodedDirectory>
                        ${project.build.directory}/${project.build.finalName}
                    </explodedDirectory>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>autoconfig</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

关于AutoConfig详情,请看第 13 章 AutoConfig工具使用指南

14.3. AutoExpand的参数

AutoExpand可用的参数包括:

表 14.3. AutoExpand命令的参数

参数名说明
-w--expand-war

是否展开war(yes或no),默认为yes。

-r--expand-rar

是否展开rar(yes或no),默认为yes。

-e--expand-ejb-jar

是否展开ejb-jar(yes或no),默认为no。

展开ejb-jar需要读取/META-INF/application.xml文件,因此会降低展开的速度。

-o--overwrite

如果目标目录中的文件比包文件中的项要新,是否覆盖之,默认为no。

指定该参数可强制覆盖文件。

如果你不信任文件中的时间戳,就可以指定这个参数。

-k--keep-redundant-files

如果目标目录存在多余的文件(也就是包里不存在的文件),AutoExpand会将它们删除,以确保展开后的目录内容与包的内容完全一致,不多不少。

指定这个参数可以避免AutoExpand删除多余的文件。

-v--verbose

显示更多信息。

-c--charset

如果AutoExpand显示的信息是乱码,请通过这个参数指定正确的字符集编码。

14.4. 本章总结

AutoExpand虽然小,但很好用,可以作为jar命令部分功能的替代品。此外,AutoConfig也利用AutoExpand来展开经过配置的包文件。