JAR

在将应用程序进行打包时,使用者一定希望仅提供给其一个单独的文件,而不是一个含有大量类文件的目录,Java 归档(JAR) 文件就是为此目的而设计的。一个 JAR 文件既可以包含类文件,也可以包含诸如图像和声音这些其他类型的文件。此外, JAR 文件是压缩的,它使用大家熟悉的 ZIP 压缩格。

 

1 、创建 JAR 文件

可以使用 jar 工具制作 JAR 文件(在默认的 JDK 安装中,位于 jdk/bin 目录下)。创建一个新的 JAR 文件应该使用的常见命令格式为:

jar cvf JARFileNameFile File2 . . .

例如:

jar cvf CalculatorClasses.jar * .class icon.gif

通常,jar 命令的格式如下:

jar options File File2 . . .

下面列出了所有 jar 程序的可选项。它们类似于 UNIX tar 命令的选项。

 

2 、清单文件

除了类文件、 图像和其他资源外, 每个 JAR 文件还包含一个用于描述归档特征的清单文件 (manifest。)清单文件被命名为 MANIFEST.MF , 它位于 JAR 文件的一个特殊 META-INF 子目录中。最小的符合标准的清单文件是很简单的:

Manifest-Version: 1.0

复杂的清单文件可能包含更多条目。这些清单条目被分成多个节。第一节被称为主节

( main section ) 0 它作用于整个 JAR 文件。随后的条目用来指定已命名条目的属性,这些已命名的条目可以是某个文件、 包或者 URL。它们都必须起始于名为 Name 的条目。节与节之间用空行分开。例如:

Manifest-Version: 1.0

描述这个归档文件的行

Name: Woozle.class

描述这个文件的行

Name: cora/mycompany/mypkg/

描述这个包的行

 

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

jar cfm JARFileName ManifestFileName . . .

例如, 要创建一个包含清单的 JAR 文件,应该运行:

jar cfm MyArchive.jar manifest.mf com/mycompany/mypkg/*.cl ass

要想更新一个已有的 JAR 文件的清单,则需要将增加的部分放置到一个文本文件中,然

后执行下列命令:

jar ufin MyArchive.jar manifest-additions.mf

 

 

3 、可执行 JAR 文件

 

可以使用jar 命令中的 e 选项指定程序的人口点, 即通常需要在调用java 程序加载器时指定的类:

jar cvfe HyPrograni.jar com.myconipany.iiiypkg.MainAppClass files to add

或者, 可以在清单中指定应用程序的主类,包括以下形式的语句:

Main-C1ass: com.nycompany.mypkg.MainAppClass

不要将扩展名 .class 添加到主类名

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

 

4、资源

在 applet 和应用程序中使用的类通常需要使用一些相关的数据文件, 例如:

•图像和声音文件。

•带有消息字符串和按钮标签的文本文件。

•二进制数据文件, 例如, 描述地图布局的文件。

在 Java 中,这些关联的文件被称为资源(resource)

 

类加载器知道如何搜索类文件,直到在类路径、 存档件或 web 服务器上找到为止。利用资源机制, 对于非类文件也可以同样方便地进行操作。下面是必要的步骤:

1 ) 获得具有资源的 Class 对象,例如, AboutPanel.class。

2 ) 如果资源是一个图像或声音文件, 那么就需要调用 getresource (filename) 获得作为

URL 的资源位置,然后利用 getlmage 或 getAudioClip 方法进行读取。

3 ) 与图像或声音文件不同,其他资源可以使用 getResourceAsStream 方法读取文件中的数据。重点在于类加载器可以记住如何定位类,然后在同一位置査找关联的资源。

 

例如,要想利用 about.gif 图像文件制作图标,可以使用下列代码:

URL url = ResourceTest.cl ass.getResource("about.gif") Image img = new Imagelcon(url).getlmage():

这段代码的含义是“ 在找到 ResourceTest 类的地方查找 about.gif 文件”。

要想读取 about.txt 文件,可以使用下列命令:

InputStream stream = ResourceTest.class.getResourceAsStreamrabout.txt"); Scanner in = new Scanner(streara,"UTF-8"):

除了可以将资源文件与类文件放在同一个目录中外,还可以将它放在子目录中。可以使

用下面所示的层级资源名:

data/text/about.txt

这是一个相对的资源名,它会被解释为相对于加载这个资源的类所在的包。注意, 必须

使用“ /” 作为分隔符,而不要理睬存储资源文件的系统实际使用哪种目录分隔符。例如,在Windows 文件系统中, 资源加载器会自动地将“ /” 转换成一个以“ /”开头的资源名被称为绝对资源名。它的定位方式与类在包中的定位方式一

样。例如,资源

/corejava/title.txt

定位于 corejava 目录下(它可能是类路径的一个子目录,也可能位于 JAR 文件中,对 applet来说在 web 服务器上。)

文件的自动装载是利用资源加载特性完成的。没有标准的方法来解释资源文件的内容。每个程序必须拥有解释资源文件的方法。另一个经常使用资源的地方是程序的国际化。 与语言相关的字符串, 如消息和用户界面

标签都存放在资源文件中,每种语言对应一个文件。这些 API 提供了组织和访问本地化文件的标准方法。程序清单 13-1 显示了这个程序的源代码。这个程序演示了资源加载。编译、创建 JAR文件和执行这个程序的命令是:

javac resource/ResourceTest.java jar cvfm ResourceTest.jar resource/Resou rceTest.mf resource/*.class resource/*.gif resource/*.tx java -jar ResourceTest.jar

将 JAR 文件移到另外一个不同的目录中,再运行它, 以便确认程序是从 JAR 文件中而

不是从当前目录中读取的资源。

 

5、 密封

可以将 Java 包密封 ( seal ) 以保证不会有其他的类加人到其中。

如果在代码中使用了包可见的类、方法和域,就可能希望密封包。如果不密封, 其他类就有可能放在这个包中,进而访问包可见的特性。

例如, 如果密封了 com.mycompany.util 包, 就不能用下面的语句顶替密封包之外的类:

package com.mycompany.util ;

要想密封一个包,需要将包中的所有类放到一个 JAR 文件中。在默认情况下,JAR 文件

中的包是没有密封的。可以在清单文件的主节中加人下面一行:

Sealed: true

来改变全局的默认设定。对于每个单独的包,可以通过在 JAR 文件的清单中增加一节, 来指定是否想要密封这个包。例如:

Name: com/mycoinpany/util/ Sealed: true Name: com/myconpany/misc/ Sealed: false

要想密封一个包,需要创建一个包含清单指令的文本文件。然后用常规的方式运行 jar命令:

jar cvfw MyArchive.jar manifest.mf files to add

 

 

 

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

 

如果是.class文件启动:

file:/C:/Users/Jon/Test/com/whatever/Foo.class

 

如果是从jar包启动:

jar:file:/C:/Users/Jon/Test/foo.jar!/com/whatever/Foo.class

 

所以,这样就简单了:

String filePath = Foo.class.getResource("Foo.class").toString(); // true: jar文件启动 // false: class文件启动 boolean road = filePath.startsWith("jar:file");

 

如何加载jar包中的Properties文件

要点一:开发调试模式下,使用jdk自带的Properties工具类加载Properties文件

Properties prop = new Properties(); // 获取Properties文件的绝对路径 // getResourec中的参数是相对classpath的位置 String basPath = Foo.class.getClassLoader().getResource("test.properties").getPath().toString(); // 标准输入流 InputStream in = new BufferedInputStream(new FileInputStream(new File(basPath))); prop.load(in);

要点二:打成可执行jar包时,如何加载Properties文件

使用类路径

String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

或者

String jarPath = this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile();

因为程序已经被打包成jar包,所以getPath()和getFile()在这里的返回值是一样的。都是/xxx/xxx.jar这种形式。如果路径包含Unicode字符,还需要将路径转码。

jarPath = java.net.URLDecoder.decode(jarPath, "UTF-8");

加载特定资源文件

// 路径拼接 URL url = new URL("jar:file" + jarPath + "!/resources/test.properties"); // 标准输入流 InputStream in = url.openStream(); prop.load(in);

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值