TPTPとJava Web Start

Javaのプロファイリングツールとしては、ずっと旧BorlandのOptimizeItや、QuestのJProbe5.1等を使っていたが、さがに古いので新たなツールを探そうと思っていたのだが、最近ではIDEと共にプロファイラを提供するのが当たり前になったようだ(それ自体は良いことだと思う)

いまやJavaのIDEの2台巨頭であるEclipseNetBeansも標準のプラグインとしてプロファイリングツールを提供している。

Eclipse Test & Performance Tools Platform Project
NetBeans Profiler

商用のツールと同様に簡単に使えるのだろうと思ってまずはEclipseのTPTPを使ってみたのだが、いきなり嵌った。
先日のエントリではJava Web Startのサービスを検出するか否かを検査することで透過なファイルアクセスができるだろうと書いたのだが、その部分のコード

protected OutputStream createSettingStream() throws IOException {
    PersistenceService ps; 
    BasicService bs; 
    try { 
        ps = (PersistenceService)ServiceManager.lookup("javax.jnlp.PersistenceService"); 
        bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService"); 
    } catch (Exception e) { 
        ps = null; 
        bs = null; 
    } 
    //Java Web Start Persistent サービスが取得できない場合はローカルに書き出す
    return new FileOutputStream( (ps != null && bs != null)
        ? "Java Web Start用のファイル名を構成"
        : "スタンドアロン用のファイル名を構成")
}

こんな感じのコードだが、このブロックでTPTPが例外を吐くのである。

Exception in thread "main" java.lang.NoClassDefFoundError: javax/jnlp/ServiceManager

原因になった"ServiceManager"はJava Web Start関連のクラスであり、javaws.jarに含まれている。
恐らくはクラスローダがらみの問題だと思われるが、原因不明。

追記:
javaws.jarをJSDKの一部として登録していたのを止めて、外部ライブラリィのjarとして登録、プロジェクトのビルドパスに追加することで例外が消えた。TPTPはブートクラスパスをみないのだろう。