2008年2月27日水曜日

Boot Class PathからVMが使えるPackagesを見つけてくるTips

追記 2008/06/28 これを元にMac用のアプリを作りました.


Q: javax.swing.tableをsystem pcakgesとしてexportしてあげるためにVMがをexportできるパッケージを自動取得したい.

A: やってみた.

1.普通のclasspathでなくbootのclasspath (sun.boot.class.path)を得る.
2.区切り文字':'で分割.
3.jarが6個とれた.
  String bootclasspath = System.getProperty("sun.boot.class.path");
String[] paths = bootclasspath.split(":");

pathsにはいかが入る.
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar


1.JarファイルのパスからJarFileクラスを生成
2.JarFileクラス通して得られるJarEntry(のEnumeration)でJar内の各ファイルが見れる.
3.基本的に「ファイル=クラス」であるのでパスの最後ファイル名を削除する.
4.ファイルの区切り文字'/'をパッケージの区切り文字'.'に置き換えて
5.同一パッケージのクラスが多数でてくるのでパッケージ名としては重複する.
  そこでListのcontainsによって重複を回避する.また,WEB-INF等もあるので
  大文字から始まる場合も回避した.

   JarFile j = new JarFile(f);
Enumeration<JarEntry> jeEnum = j.entries();
while (jeEnum.hasMoreElements()) {
JarEntry je = jeEnum.nextElement();
String className = je.getName();
String packageName = className.substring(0, className
.lastIndexOf("/"));
packageName = packageName.replaceAll("/", ".");
if (packages.contains(packageName) == false
&& Character.isLowerCase(packageName.charAt(0))) {
packages.add(packageName);
}
}

javax.swing
javax.swing.border
javax.swing.colorchooser
javax.swing.event
javax.swing.filechooser
(一部 全部で660あった MacOSX 10.5/ JRE1.5.0)


とさ.
ただやっぱり毎回やると時間がかかるので初回のみにしてファイルは作るようにした.
#だったらオリジナルのfelixみたいにconf.propertiesを使えば良いわけだがダイナミックにやってみたかった.

0 件のコメント: