torutkのブログ

ソフトウェア・エンジニアのブログ

NetBeans 8.0のソースを追う(Scene Builderの設定)

Scene Builderを自前でビルドしたものをNetBeansの[ツール]メニュー > [オプション] > [Java] > [JavaFX]タブで、Scene Builderホームに設定してみたところエラー(「選択した場所 C:\Program Files\JavaFX Scene Builder には有効なJavaFX Scene Builderインストールが表示されていません。」)となってしまいました。

32bitビルドしてみたり、exe名をあわせてみたりと試行錯誤してみた限りではエラーが解消できなかったので、NetBeansソースコードを追いかけてみました。

javafx2.scenebuilder モジュール

たぶんこれだろうと目星をつけてソースコードを追ってみました。
Scene Builderのディレクトリを設定するファイル選択ダイアログを表示している箇所が次のようです。

  • javafx2.scenebuilder/src/org/netbeans/modules/javafx2/scenebuilder/options/SBOptionsPanel.java のbrowseAddNewRuntimeメソッド
        if (JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(this)) {
            File f = chooser.getSelectedFile();
            String newRuntimePath = f.getAbsolutePath();
            Home h = SBHomeFactory.getDefault().loadHome(newRuntimePath);
            if (h != null) {
                HomeDef newHd = new HomeDef(h);
                sbHome.getModel().addUserDefined(newHd);
                sbHome.getModel().setSelectedItem(newHd);
            } else {
                NotifyDescriptor nd = new NotifyDescriptor.Message(Bundle.MSG_InvalidSBHome(newRuntimePath), NotifyDescriptor.ERROR_MESSAGE);
                DialogDisplayer.getDefault().notifyLater(nd);
            }
        }

ここで、ファイル選択ダイアログ(JFileChooser)で選択したディレクトリをSBHomeFactoryクラスのloadHomeメソッドに渡しています。ここでnullが返るとScene Builderとして認められないとエラーになっています。

  • javafx2.scenebuilder/src/org/netbeans/modules/javafx2/scenebuilder/impl/SBHomeFactory.javaのgetDefaultメソッド
    • SBHomeFactory.HomeFactoryCommonクラス(ネストクラス)をnewして戻す
    • SBHomeFactory.HomeFactoryCommonクラスのloadHomeは、同クラスのgetHomeForPathを呼ぶ
    • ファイル選択ダイアログで指定したパスの下にプロパティLAUNCHER_PATHで指定したファイルの存在をチェック
      • LAUNCHER_PATHは、javafx2.scenebuilder/src/org/netbeans/modules/javafx2/scenebuilder/impl/Bundle.properties に記載されたXXX_LAUNCHER(XXXはOS名が入る)
    • ファイル選択ダイアログで指定したパスの下にプロパティPROPERTY_PATHで指定したファイルの存在をチェックおよび存在すればプロパティファイルとして読み込み
      • PROPERTY_PATHは、javafx2.scenebuilder/src/org/netbeans/modules/javafx2/scenebuilder/impl/Bundle.properties に記載されたXXX_PROPERTY(XXXはOS名が入る)
SB_Version=2.0.4;2.0.3;2.0.2;2.0.1;2.0;1.2;1.1;1.0;$empty$

#WINDOWS
WIN_WKIP=C:\\Program Files (x86)\\Oracle\\JavaFX Scene Builder $ver$;C:\\Program Files\\Oracle\\JavaFX Scene Builder $ver$
# launcher location; using forward slash as the path separator
WIN_LAUNCHER=JavaFX Scene Builder $ver$.exe;bin/scenebuilder.exe
# properties location; using forward slash as the path separator
WIN_PROPERTIES=app/scenebuilder.properties;bin/scenebuilder.properties

#MAC
MAC_WKIP=/Applications/JavaFX Scene Builder $ver$.app
MAC_LAUNCHER=Contents/MacOS/scenebuilder-launcher.sh
MAC_PROPERTIES=Contents/Java/scenebuilder.properties;Contents/Resources/Java/scenebuilder.properties

#UN*X
UX_WKIP=/opt/JavaFXSceneBuilder$ver$;~/JavaFXSceneBuilder$ver$
UX_LAUNCHER=JavaFXSceneBuilder$ver$
UX_PROPERTIES=app/scenebuilder.properties

NetBeans が指定したディレクトリをScene Builderのホームとして認識する条件(Windowsの場合)

次の実行ファイルが指定したパスの下に存在する

  • "JavaFX Scene Builder N.N.N.exe"がある
    • 注)バージョンの数字は、上述Bundle.propertiesのSB_Versionに定義のいずれか
  • または、"JavaFX Scene Builder .exe"がある
    • 注).exeの直前に空白1文字が必要です(NetBeansのバグな感じもしますが・・・)
  • または、"bin/scenebuilder.exe"がある

次のプロパティファイルが指定したパスの下に存在し、java.util.Propertiesクラスでload可能である

  • "app/scenebuilder.properties"がある
  • または、"bin/scenebuilder.properties"がある

Scene Builderのソースを自力でMSI形式にビルドしインストールしたときは、デフォルトではJavaFX Scene Builder.exeができるので実行ファイルの条件に合いません。次に、プロパティファイルが存在しません。この両者とも条件が満たせずエラーになっているようです。

そこで、生成される実行ファイル名にバージョン番号を含むようにし、次にappの下にscenebuilder.propertiesファイルを置くようにインストーラを生成する対処が必要になります。

(参考)Scene Builderをネイティブ(MSIインストーラ形式)ビルド・インストールする方法を以下に記載しています。ただし、今回の問題には未対応(対応方法調査中)です。

Scene Builderの構築 - ソフトウェアエンジニアリング - Torutk

(2015-04-03追記)NetBeansの対応状況

NetBeansの開発版には新しいScene Builderのバイナリのインストールを認識する修正が入りました。20150321以降の開発版を使うと認識してくれるようです。
https://netbeans.org/bugzilla/show_bug.cgi?id=251308

現在の開発版は、2015-10にリリース予定のVer.8.1向けです。