对同样的类安装有许多不同的版本,这是件很令人头痛的事。以下介绍的是一种与之有关的方法。
类路径会引起许多麻烦,这些麻烦在当引用一些java类时会出现。与类路径有关的问题之一是,同一类的许多不同版本可能同时出现在类路径中,虚拟机会装载它所发现的第一个版本。当然也会有无法避免这一情况的时候,例如当你的应用程序是在一个容器里面运行的时候。包装的jar文件可以对这个问题进行局部的补救。
当你在应用程序中使用包装的jar文件时,类装载器可以确保同一个包中所有的类都是从同一个jar文件中装载得来的。例如,假定类com.acme.A是从包装的文件acme.jar中装载的。接下来,该类装载器会被指示去装载类com.acme.B。由于A与B是在同一包中,该类装载器会试着从acme.jar装载类B。如果在acme.jar中找不到类B,而在其它地方可以找到,则该类装载器就会抛出SecurityException了。
包装一个jar文件很简单,就如同在该jar的manifest文件中提供一个条目一般简单。以下是一些命令,它们能帮助你创造一个包装的jar文件,这个jar文件包含com目录下的所有类以及它的子目录的所有包:
jar cmf mymanifest.txt myjar.jar com
where mymanifest.txt contains:
Manifest-Version: 1.0
Sealed: true
现在,该类装载器把整个jar文件都看成是包装的了,这个jar文件由它使用。尽管包装你的jar文件并不能解决所有的问题,然而它确实对你有益处。这也是一个好习惯,我们可以试着养成这样一个习惯,所以赶快让包装jar文件成为你的开发系统中的一部份吧。对于包装,还有更多的选择;例如,你可以包装一些包而不包装其它的。