Java的JAR文件入门篇

来源:互联网 发布:apache nginx 比较 编辑:程序博客网 时间:2024/06/06 18:24

Java的JAR文件入门篇

  1. Jar文件概述

为了创建提供给用户使用的应用程序,我们需要知道这些应用程序如何进行打包。使用者希望的是仅提供一个单独的应用程序文件,而不是一个包含有大量类文件的目录。而Java的Jar文件就是为此目的而设计的。

Jar文件是Zip格式的文件,它的魔数(魔数是用于识别一个文件类型特征的固有属性,一般是指该类型文件的头几个字节,Zip(Jar)文件的魔数为0x504B0304,对应的ASCII字符串如下:PK[ETX][EOT])

  1. Jar文件的常见命令格式

可以使用Java自带的Jar工具(位于JDK安装目录的bin目录中)来生成JAR文件。通常我们使用以下指令来创建Jar:

Jar cvf JAR_NAME File1 File2

注:Jar中指定的文件可以是类文件,也可以是诸如图像和音频等资源文件。

如:

Jar cvf test.jar com/test/*.class

将com/test/目录下的文件打入到jar中,但子目录下的class文件则不会被打入。

通用Jar命令格式如下:

Jar options File1 File2jar

命令格式:jar {c t x u f }[ v m e 0 M i ][-C 目录]文件名...

  

其中{ctxu}这四个参数必须选选其一。[v f m e 0 M i ]是可选参数,文件名也是必须的

类似于linux的tar指令,对应的options参数如下:

参数

说明

c

创建一个新的或者空的存档文件,并加入文件。如果指定的文件名是目录,jar程序将对它们进行递归处理

C

暂时改变目录,如:

jar cvf JAR_NAME –C classes *.class

切换classes子目录,以添加其中的class

e

在清单文件中创建一个条目

f

将Jar文件名指定为第二个命令行参数。如果没有这个参数,jar文件会将结果写到标准输出上(在创建JAR文件时),或者从标准输出中读取它(在解压或者列出JAR文件内容时)

m

将一个清单文件(manifest)添加到JAR文件汇总。清单是对存档内容和来源的说明。每个归档有一个默认的清单文件。如果想验证归档文件的内容,可以自己提供自己的清单文件。

M

不为条目创建清单文件。

t

显示内容表

u

更新一个已有的JAR文件

v

生成详细的输出结果

x

解压文件。如果提供一个或多个文件名,只压缩

  1. 清单文件

除了类文件,图像和其它资源外,每个JAR文件还包含一个用于描述归档特征的清单文件(manifest)。

清单文件被命名为MANIFEST.MF,它位于Jar的META-INF子目录下,最小符合标准的清单文件如下:

Manifest-Version:1.0

复杂的清单文件可能包含更多的条目。这些清单条目被分为多个节。第一节被称为主节。它作用于整个JAR文件。随后的条目被用来指定已命名条目的属性,这些已命名条目可以是某个文件,包或者URL。它们都必须起始于名为Name的条目。节与节之间用空行隔开。

Manifest-Version:1.0

描述这个归档文件的行

 

Name:Test.class

描述这个文件的行

 

Name:com/mycomany/mypkg/

描述这个包的行

要想编辑清单文件,需要将希望添加到清单文件的行放入到文本文件中,然后运行:

Jar cfm JAR_NAME Manifest_Name ….

如创建一个包含清单的JAR文件:

Jar cfm MyArchive.jar Manifest.mf com/mycomany/mypkg/*.class

要想更新一个已有的JAR文件的清单,则需要将增减的部分放置到一个文本文件中,然后执行如下命令:

Jar ufm MyArchive.jar manifest-additions.mf

  1. 可运行的JAR

可以使用Jar命令中的e选项来指定程序的入口点,即通常需要在调用Java程序加载器时指定的类。

Jar cvfe MyProgram.jar com.mycompany.mypkg.MainClass files to add

或者可以在清单文件中指定应用程序的主类,如

Main-Class: com.mycompany.mypkg.MainClass

不要将扩展名.class添加上去。

注:清单文件的最后一行必须以换行符结束,否则清单文件将无法被正常读取。

启动应用程序:

Java –jar MyProgram.jar

在windows平台上可以使用第三方的打包工具将JAR文件转换Windows可执行程序,打包器是一个exe的windows程序,它可以查找和加载Java虚拟机(JVM),或者在没找到JVM时告诉用户应该做什么,常见的软件有:

  • JSmooth
  • Launch4j
  • IzPack

5 、资源

在应用程序中,使用的类通过需要与一些数据文件交互,例如

  • 图像和声音文件
  • 带有消息字符串和按钮标签的文本文件
  • 二进制数据文件,如描述地图布局的文件

这些关联的文件在Java中统一被称为资源(resource)。相比与Windows可执行程序,其资源都附属于可执行程序,并通过标准程序设计访问。Java资源则作为单独的文件存储,不作为类文件的一部分。对资源的访问与解释由每个程序自己完成。

通常,我们不能将字符硬编码到代码中,而是通过文本文件对这些字符进行管理,而文本文件在这里则是作为资源文件,与其它程序文件一起放入Jar中管理。类加载器指导如何搜索类文件,直到在类理解,Jar文件中,web服务器上找到为止。利用资源机制,对于非类文件也可以用同样方便进行操作:

  • 获取具有资源的Class对象
  • 如果该资源文件是图像或音频文件,调用其getResource(filename)获取作为URL的资源的位置,然后利用getImage或getAudioClip方法读取。
  • 与图像或音频文件不同,其它文件可以使用getResourceAsStream方法读取文件中的数据。

    重点在于类加载器可以记住如何定位类,然后在同一位置查找关联的资源。如:

    URL url = ResourceTest.class.getResource("icon.gif");

    Image img = new ImageIcon(url).getImage();

    即在ResourceTest类位置查找icon.gif。

    读取文本文件,则:

    InputStream stream = ResourceTest.class.getResourceAsStream("string.txt");

    Scan in = ne Scanner(Stream);

    一般我们不将资源文件与类文件放入同一目录,而是放入单独的目录汇总,如:

    data/text/string.txt

    这是一个相对的资源名,它会被解释为相对于加载这个资源的类所在的包。使用"/"作为分隔符,而与系统无关。一个以"/"开头的资源别称为绝对资源名,它的定位方式与类在包中定位方式一样:

    /resource/title.txt

定位于Resource目录下(可能是类路径的一个子目录,也可能位于JAR文件中或Web服务器上)。

文件的自动装载是利用资源加载特性完成的。没有标注的方法来解释资源文件的内容,每个程序都必须自己拥有解释资源文件的方法。

在国际化中经常使用资源,与语言相关的字符串,如消息和用户界面标签都存放在资源文件中,每种语言对应一个资源文件。

 

  1. 密封

可将Java包分装(seal)以保证不会有其它的类被添加进来,这是为了防止,代码中使用了包可见的类,方法和域,通过密封,来保证其它包无法可见。

如果使用类密封包,如com.mycompany.util包,就不能使用:

Package com.mycompany.util:

来顶替密封包以外的类。

    通过在Jar文件的清单主节中加入一行:

    Sealed:true

来改变全局的默认设置。对于每个单独的JAR文件的清单中增加一节,来指定是否要密封这个包。

Name:com/mycompany/util

Sealed:true

 

Name:com/mycompany/misc/

Sealed:false

通过创建一个包含清单指令的文本文件,然后用常规的方式运行jar指令。

Jar cvfm MyArchive.jar manifest.mf

原创粉丝点击