当发布一个应用程序时,并不希望部署大量的类文件。类似于applet,应该把程序需要的相关类文件和其他资源文件打包成一个jar文件。一旦将程序打包后,就可以通过一个简单命令加载它,如果正确地配置了操作系统,就可以通过双击jar文件来加载。
1 清单文件
    可以把应用程序、程序组件和代码库打包到jar文件中。例如,JDK的运行库就包含在一个很大的文件rt.jar中。
    jar文件是一个简单的ZIP文件,它包含类文件、程序需要的其他文件以及描述存档特性的清单文件(manifest)。
    清单文件被命名为MANIFEST.MF,它在jar文件的一个特殊META-INF子目录下面。最小的符合标准的清单文件是很简单的:
    Mainfest-Version: 1.0
    复杂的清单文件可以包含更多条目。这些清单条目被分成多个节。第一部分称为主节(main section)。它作用于整个JAR文件。后续的条目同来指定已命名条目的属性,这些已命名的条目可以是某个文件、包或者URL。它们都必须以名为Name的条目开头。节与节之间用空行分开。例如:
    Manifest-Version:1.0
    描述这个归档文件的行
    Name:XXX.class
    描述这个文件的行
    Name:com/mycompany/mypkg/
    描述这个包的行
    要想编辑清单文件,则需要将希望添加到清单文件中的行放到文本文件中,然后运行下列命令:
    jar cfm xxx.jar manifest.mf...
    例如,要想创建一个具有清单的jar文件,运行下列命令:
    jar cfm xxx.jar manifest.mf 指定目录/*.class
    要想为一个已存在的jar文件的清单增加条目,需要将增加的部分放置到文本文件中,然后执行以下命令:
    jar ufm xxx.jar manifest-additions.mf
2 自运行JAR文件
    要想打包一个应用程序,就应该将应用程序需要的所有文件放置到一个JAR文件中,然后在清单文件中增加一项指定程序的主类(main class)——该类一般需要调用java程序启动器指定的类。
    创建一个名为mainclass.mf的文件,其中包含下面一行:
    Main-Class:所在目录名/MainAppClass
    不要将扩展名.class增加到主类名中。然后运行jar命令:
    jar cvfm XXX.jar mainclass.mf files to add
    用户可以简单地通过下面命令来启动应用程序:
    java -jar XXX.jar
    根据操作系统的配置,可以通过双击jar文件图标来启动应用程序。
    ·在Windos平台,Java运行时安装器建立扩展名为.jar的文件与javaw -jar命
      令相关联来启动文件。
    ·在Solaris平台,操作系统能够识别jar文件的格式并用java -jar命令来运行
      它。
    ·在Mac OS X平台,操作系统可以识别.jar文件扩展名,当双击JAR文件时就可
      以运行Java程序。而且,MRJAppBuilder的打包工具允许把JAR文件转换为一 
      个顶级的、可双击的、具有定制的类路径、图标等的Mac程序。
3 资源
    应用程序中使用的类通常使用一些相关的数据文件,例如:
    ·图像和声音文件。
    ·带有消息字符串和按钮标签的文本文件。
    ·二进制数据文件,例如,描述地图布局的文件。
    在Java中,这些关联的文件称为资源(resource)。
    类加载器知道如何搜索类文件,只要它被放置到类路径、存档文件或Web服务器上。利用资源机制,对于非类文件也可以同样方便地操作。下面是必要的步骤:
    1) 获得具有资源的Class对象。
    2) 调用getresource(filename)来获取作为URL的资源的位置。
    3) 如果资源是图像或音频文件,可以使用getImage或getAudioClip方法直接读取。
    4) 否则,通过URL调用openStream方法读取文件中的数据。
4 密封
    可以将java语言包密封,以保证其他类不能加入到其中。如果在代码中使用可见的类、方法和域,那么可能希望对包密封。
    例如,如果密封了com.mycompany.util包,那么就不能用下面的语句定义密封包外的类:
    package com.mycompany.util;
    要实现这点,需要把包中所有的类放到一个JAR文件中。在默认情况下,JAR文件中的包是没有密封的。可以在清单文件的主节中加入下面一行:
    Sealed:true
来改变全局默认的设定。对于每个单独的包,通过在JAR文件清单中增加一节,可以指定是否密封该包。例如:
    Name:com/mycompany/util/
    Sealed:true
    Name:com/mycompany/misc/
    Sealed:false
    要密封一个包,应创建一个包含清单文件指令的文本文件。然后使用通常的方法运行jar命令:
    jar cvfm XXX.jar manifest files to add