LibreOffice(63)FirstStepsの例をNetBeansでビルドする

前の関連記事:LibreOffice(62)Javaの例をNetBeansでブレークポイントを設定する


Makefileと同様の/opt/libreoffice4.3/sdk/classes以下のファイルやmanifest.mfを含めたjarファイルをNetBeansで作成するにはbuild.xmlを編集する必要がありました。

Makefileでやっている内容をNetBeansで再現する


LibreOffice(22)FirstStepsのMakefileで使うJDKのコマンド

LibreOffice(23)FirstStepsのMakefileの出力ログ

FirstStepsのフォルダにあるMakefileがなにをしているのかはこの二つの記事で解析しましたね。

このときに解析しておいてよかったです。

この二つの記事を書いていなかったら今回の記事は書いていなかったでしょう、、、

Makefileはもう1年以上触っていないのですっかり内容を忘れており、もう一度この二つの記事をじっくり読む必要がありました。

やはり学習したことはちゃんとコツコツと記録しておくのがよいですね。

まあ長年の経験でそういうふうに悟ったのでこのブログを書いているわけですけど。

LibreOffice(62)Javaの例をNetBeansでブレークポイントを設定するまでGUIで設定した後、Makefileと同様のjarファイルを作成のためにしないといけないことは以下の3つになります。

①manifest.mfのメインセクションのMain-Classにcom.sun.star.lib.loader.Loaderを設定、個別セクションのName: com/sun/star/lib/loader/Loader.classにApplication-Class: javaソースファイル名を設定します。

②/opt/libreoffice4.3/sdk/classes以下のファイルをjarファイルに含めます。

③各javaソースファイル名ごとのjarファイルを生成します。

①のメインセクションについてはプロジェクトのプロパティに設定できました。

しかし個別セクションについてはNetBeansのGUIで設定する方法はみつけられませんでした。

②、③についてはGUIでは全く無理でした。

ということでNetBeans付属ビルドツールのAntのbuild.xmlを編集してこれらを実現するしかありませんでした。

build.xmlのどこを編集すればよい?



build.xmlはファイルウィンドウのなかで項目がみれます。

これはMakefileでいうターゲットが表示されていてここに割り込ませればよいと思ったのですが、このターゲットは実行順に並んでいるわけではない上にその内容は変数だらけで依存関係も複雑に絡み合っていて解読がとても困難でした。

結局途中に割り込ませるのは諦めて、デフォルトでプロジェクトをビルトしたら生成されるFirstSteps.jarファイルができあがってから処理することにしました。

jarファイルが終わったあとのターゲットは-post-jarターゲット、とbuild.xmlに書いてあります。

ファイルウィンドウのbuild.xmlの中の-post-jarターゲットをダブルクリックするとbuild-impl.xmlが開きます。
    <target name="-post-jar">
        <!-- Empty placeholder for easier customization. -->
        <!-- You can override this target in the ../build.xml file. -->
    </target>
このターゲットはカスタマイズ用にデフォルトでは空っぽです。

build.xmlにコピーして使えと書いてあるのでbuild.xmlの</project>の上にペーストします。
    <target name="-post-jar">
        <!-- Empty placeholder for easier customization. -->
        <!-- You can override this target in the ../build.xml file. -->
    </target>
</project>

-post-jarターゲットを編集する


最初はFirstSteps.jarを分解して作り直さないといけないと思ったのですが、コンパイルしたclassファイルはbuild/classesフォルダにあることを発見したので、まずはFirstSteps.jarファイルを削除してしまいます。
    <target name="-post-jar">
        <!--作成済のjarファイルを削除する-->
        <delete>
            <fileset dir="${dist.dir}" includes="*.jar"/>
        </delete>
    </target>
build.xml内で使えるコマンドについてはApache Ant™ User Manualの左のフレームのAnt Tasks→List of Tasks、の一覧から解説と例がみれます。

バージョンが古くなりますがApache Ant User Manualの左のフレームのAntのタスク→コアタスク、から日本語の解説もみれます。

${dist.dir}はnbproject/project.propertiesで定義されているビルド後のjarファイルが入るフォルダです。

とりあえずそのフォルダにあるjarファイルを全部消してしまいます。

あとはjarコマンドでjarファイルを新たに作ればよいのですが、各javaソースファイルに対して同じ処理を繰り返すのでマクロにしてしまいます。
       <macrodef name="macroname"><!--マクロの名前を定義-->
            <attribute name="args1" /><!--引数1を定義-->
            <attribute name="args2" /><!--引数2を定義-->
            <!--引数名にアンダーバー"_"は含めてはいけない-->
            <element name="elements1"/><!--コマンドも引数にできる-->
            <sequential>
                <elements1/><!--引数のコマンドを実行-->
                <!--引数は"@{args1}"で引用できる-->
            </sequential>
        </macrodef>
        
        <!--マクロの呼び出し方-->
        <macroname args1="変数1" args2="変数2"/>
        
        <!--マクロの呼び出し方(コマンドを引数にする場合)-->
        <macroname args1="変数1" args2="変数2">
            <elements1>
                <!--引数にするコマンド-->
            </elements1>
        </macroname>
これを使ってbuild/classesフォルダ(${build.classes.dir})からclassファイルをとってきてnpproject/distフォルダ(${dist.dir})にjarフォルダを作るマクロを作ります。
        <!--classファイル名からjarファイルを作成するマクロ-->
        <macrodef name="mkjar">
            <attribute name="class.name" /><!--拡張子を除くjavaソースファイル名を引数にする-->
            <sequential>
                 <jar destfile="${dist.dir}/@{class.name}.jar">
                    <!--build/classesフォルダからclassファイルを得る-->
                    <fileset dir="${build.classes.dir}">
                        <include name="@{class.name}.class" />
                    </fileset>
                    <!--LibreOffice固有のファイルをjarファイルに入れる-->
                    <fileset dir="/opt/libreoffice4.3/sdk/classes">
                        <patternset>
                            <include name="com/sun/star/lib/loader/*.class"/>
                            <include name="win/unowinreg.dll"/>
                        </patternset>
                    </fileset>
                    <manifest><!--manifest.mfを生成-->
                        <attribute name="Main-Class" value="com.sun.star.lib.loader.Loader"/>
                        <section name="com/sun/star/lib/loader/Loader.class">
                            <attribute name="Application-Class" value="@{class.name}"/>
                        </section>
                    </manifest>
                </jar>
            </sequential>
        </macrodef>
manifest.mfも一緒に作成してjarファイルに入れています。

このマクロでは文字列操作はしていませんが、Antで文字列を操作するには一旦ファイルに書き出さないといけないようです。

Antビルドファイル内でプロパティの文字列置換 - 高見知英のかいはつにっし(β)

LinuxではApplyでsedを使えばファイルに書き出さなくてもできそうですね。

あとはマクロの呼び出し部分を追加すれば完成です。
    <target name="-post-jar">
        <!--作成済のjarファイルを削除する-->
        <delete>
            <fileset dir="${dist.dir}" includes="*.jar"/>
        </delete>
        <!--classファイル名からjarファイルを作成するマクロ-->
        <macrodef name="mkjar">
            <attribute name="class.name" /><!--拡張子を除くjavaソースファイル名を引数にする-->
            <sequential>
                 <jar destfile="${dist.dir}/@{class.name}.jar">
                    <!--build/classesフォルダからclassファイルを得る-->
                    <fileset dir="${build.classes.dir}">
                        <include name="@{class.name}.class" />
                    </fileset>
                    <!--LibreOffice固有のファイルをjarファイルに入れる-->
                    <fileset dir="/opt/libreoffice4.3/sdk/classes">
                        <patternset>
                            <include name="com/sun/star/lib/loader/*.class"/>
                            <include name="win/unowinreg.dll"/>
                        </patternset>
                    </fileset>
                    <manifest><!--manifest.mfを生成-->
                        <attribute name="Main-Class" value="com.sun.star.lib.loader.Loader"/>
                        <section name="com/sun/star/lib/loader/Loader.class">
                            <attribute name="Application-Class" value="@{class.name}"/>
                        </section>
                    </manifest>
                </jar>
            </sequential>
        </macrodef>
        <!--コンパイルするjavaファイルのリスト-->
        <mkjar class.name="FirstUnoContact"/>
        <mkjar class.name="FirstLoadComponent"/>
        <mkjar class.name="HelloTextTableShape"/>
    </target>
マクロの呼び出しはbuild/classesフォルダからファイル名リストを取得してループを回して汎用性をもたせた処理にしたかったのですが、Antのデフォルトではループ文が用意されていないようですので諦めました。

FirstStepsの例をNetBeansでビルドする


あとはビルドすればよいのですが、デフォルトではライブラリがコピーされてきますのでその設定をオフにしておきます。

プロジェクトのプロパティ。


カテゴリ:パッケージング。

「依存ライブラリをコピー」のチェックをはずします。


実行→プロジェクト(FirstSteps)を消去してビルド。


distフォルダに3つのjarファイルができていますね。

FirstUnoContact First Contact - Apache OpenOffice Wiki

FirstLoadComponent Example: Working with a Spreadsheet Document - Apache OpenOffice Wiki

HelloTextTableShape Example: Hello Text, Hello Table, Hello Shape - Apache OpenOffice Wiki

デベロッパーズガイドへのそれぞれの該当箇所をさがしてみました。

linuxBeanのdistフォルダでTerminalを実行してはいけない


あるときからファイルマネージャでdistフォルダをみるとjarファイルがなにも生成されていないことに気がつきました。

NetBeansのファイルウィンドウからみるとちゃんとdistフォルダにjarファイルが生成されているのにもかかわらず実際はjarファイルがないのです。

linuxBeanを再起動してからビルドしなおすとjarファイルが作られるのですが、またあるタイミングでjarファイルが作られなくなります。

原因が判明するまであれこれしましたが結局NetBeans7.1から既にある既知の問題とわかりました。

java - Not able to Compile and Create jar file using Netbeans 7.1 Beta version - Stack Overflow

distフォルダでTerminalを実行すると問題が起こるようです。

Ubuntuでも問題が起こるように思いますが他に同じことを書いているページは見つけられませんでした。

作成したjarファイルをTerminalから実行する


Terminalから実行できるのであればランチャを作ればGUIで起動できることになります。

前述のようにdistフォルダでTerminalを起動するとNetBeansからビルドできなくなるので必ずjarファイルを他のフォルダに移動させてからTerminalで実行します。

LibreOffice(23)FirstStepsのMakefileの出力ログでみたようにTerminalからの起動にはunopathを指定するオプションが必要です。
pq@linuxBean:~/ドキュメント$ java  -Dcom.sun.star.lib.loader.unopath="/opt/libreoffice4.3/program" -jar FirstLoadComponent.jar
CE> WARNING: gnome-keyring:: couldn't connect to: /tmp/keyring-nc16L7/pkcs11: そのようなファイルやディレクトリはありません
com.sun.star.sheet.XSpreadsheet
Formula cell in column 0, row 2 contains =SUM(A1:A2)
これでうまくいきました。

参考にしたサイト


First Contact - Apache OpenOffice Wiki
EclipseでのAntビルドスクリプトの例が載っています。

Apache Ant™ User Manual
左のフレームのAnt Tasks→List of Tasks、からAntのタスク一覧の解説が読めます。

Apache Ant User Manual
バージョンが古いですが左のフレームのAntのタスク→コアタスク、から日本語の解説もみれます。

Ant マクロ(macrodef)を使う - kaishitaeiichiの日記
macrodefの定義を先にしておかないとエラーがでてしまいました。

java - Not able to Compile and Create jar file using Netbeans 7.1 Beta version - Stack Overflow
distフォルダでTerminalを実行するとNetBeansからjarファイルが作られなくなりました。

LibreOffice 4.3 SDK - Developer's Guide Examples
SDKに含まれる例の一覧。

次の関連記事:LibreOffice(64)Professional UNO example

PR

0 件のコメント:

コメントを投稿