JAR里的class呼叫JAR外的class
JAR 是一个很好的压缩性工具,可以把许多 classes 档案压缩进一个 JAR 里面,节省了 HTTP request connection 的需求。
在这同时,也只有把程式压缩成 JAR 的格式,才有可能做出数字签名(signed applet),也只有数字签名,才能让 user 选择要 break the sand box: 也就是 bypass Java 的 security。
我在开发中遇到一个问题,我的所有 class 档案太大了,我的 Java project 包含了一个很庞大的 class 库,至少有一百个 class 档案。
很不巧的,我的 main class 需要 bypass Java 的 security (因为必须要用到 JNI),所以很明显,我的 main class 一定要被包装进 JAR 里面。
如果全都包装进 JAR 里面,档案太大了。而且不是每个档案都会有用到。
可是,如果不把全部档案包含进去,只把 main class 放入 JAR,其他的使用 class 的话,main class 又找不到其他的 class 档案(因为它们不在 main class 所在的 JAR 里面)
解决方法是:
添加一个 manifest.mt 的档案,里面内容加写说
Class-Path: clsHello.jar
那么,这个 clsHello.jar 就算被列入 main JAR 寻找的 classpath 范围内了。也就是说,mainHello.jar 里面的 class,可以呼叫 clsHello.jar 里面的 class 了。
这些知识对于 Java 高手应该是轻而易举,我只是要记录下来怕自己忘记了而已。
附注:如果 main JAR 被 signed 的话,其他 classpath 内的 JAR files (例如 clsHello.jar) 也必须要被 signed。否则会出现数字签名不对的问题。
至于这样搞,download main JAR files 的时候,会不会顺便也 download clsHello.jar,还是等到有用到clsHello 里面的class file的时候才装上,我就不知道了。因为除非监视 IIS或者apache 的log file,否则要查出来也是不容易的。
近期评论