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 件のコメント:
コメントを投稿