プログラム実行時にクラスパスを追加する

前のエントリーで、Flex SDKのCompiler APIを使ってMXMLをビルドしてSWFを生成できるようになった。


ここでビルドに使うFlex SDKはどこにあるのだろう。


一つは、アプリのパッケージにFlex SDK同梱して、同梱されたSDKのみを使うようにする。そうしたら、SDKの場所は特に悩まなくて済む。
でも同梱してしちゃうと、SDKのバージョンが上がるたびにパッケージしなおさなくちゃいけないし、
あとライセンス的に大丈夫なの?って気もする。
# 調べてないけど、考えるのが面倒なので。
あと、既にFlex開発をかじっている人(というか自分)にとって、さらにFlex SDKを追加されるのはあまりいただけない。結構でかいし。


もう一つは、ユーザがローカルディスク上に展開したFlex SDKを指定して使う。
Flex Builderの「インストールされているFlex SDK」という設定項目、あんな感じで。


今回のアプリでは、後者を選択した。
ただ、ユーザが任意のディレクトリのFlex SDKを追加/削除できちゃうと、
アプリからするとどこにSDKがあるかわからなくなって、予めクラスパスを通すのが難しくなる。
なのでComiler APIを使うために、Javaプログラムでクラスパスを動的に追加する必要がある。
というわけで、今回のテーマは「クラスパスを動的に追加する方法」です(前置き、ながッ…)。
# このアプリに限らないJavaの技のお話ですね。


具体的にはどうやるか。
ハイ、参考サイト
これをそのまんまやってみた。完璧!すごいなぁ。為になりました。

ただ、ディレクトリを指定すると、うまく動かないことがあったので、下のように若干修正した。

    public static void addFile(File f) throws IOException {
        if (f.isDirectory()) {
            File[] child = f.listFiles();
            for (int j = 0; j < child.length; j++) {
                addURL(child[j].toURL());
            }
        } else {
            addURL(f.toURL());
        }
    }

ディレクトリを指定するとその下にあるファイルを全部登録して、
且つ、配下のディレクトリに対し、再帰的に実行するようにした。


jarファイルだろうがなんだろうが、問答無用でクラスパスに登録しちゃってるけどね。


# イカン、早くもネタが尽き始めとるorz