2007年9月28日 星期五

偉哉 Apache2

Root Beer - Serving Pack200 Jar files with Apache 2
最近一直被 WebStart 的 JAR 檔案大小所困擾。程式越寫越大,每次需要update的 JAR 就越來越肥、越來越多。


雖然之前就知道 JDK 都會送一個叫做 pack200 的壓縮工具,Pack200 實際上是把 JAR 壓縮起來傳輸,等傳到client 機器以後把解壓縮的工作丟給 client 機器來。
Pack200 把 XXX.jar 壓完以後改為 xxx.pack.gz,Webstart Client 在 request file 的時候,會把 Accepted Encoding 送到 server 去,可以接受的有 .gz 和 pack.gz 兩種。如果Server 發現有 <檔名>.pack.gz 的話,會優先送出,再來是 .gz,最後才是 .jar。但是 server side 每次都得裝個 container + servlet,由 servlet 來負責做 content negotiation,實在很不方便。
有一天,v3g 長輩看到我在頻道上問 mod_deflate 有沒有辦法改出 mod_pack200 來用,就很慷慨地說要幫我用 output_filter 寫一隻,今天測試完成。本來想就這樣deploy到香港去,應該可以節省不少 update 的頻寬。沒想到長輩真是太英明了,找到兩篇用 Apache2 內建的功能就可以達到相同目的的文章。
第一篇用的是 re-write engine,第二篇更暴力,直接開Multiview,把 .pack.gz 的 Mimetype 用 ForceType 和 Java Achive 綁在一起。第二個方法雖然很簡單,但是因為 Multiview 的 serve 順序會和原來 SUN 建議的方式不一樣,會以 .jar 優先,再來才是 .pack.gz。不過這並不影響我的用途,因為 JAR file 本來就會先 pack/sign 才會丟上 server 去,只要不要把 jar 放進去就可以了。

沒有留言:

張貼留言