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

ラベル: ,

前の関連記事:LibreOffice(21)makeについてちょっとお勉強 その2


FirstStepsのMakefileにでてくるJava Development Kit (JDK) のコマンドを学習します。
(H25.2.20追記。Windows7 64bitではJavaのbootstrap()は動かないようでJavaの例はソケット接続に修正しないと動きません。詳しくはLibreOffice(27)Java-UNO Bootstrapはやめてソケット接続を使おうへ。)

コンパイルで使うコマンドはjavacとjar、実行時に使うコマンドはjava


FirstStepsのMakefileでコンパイルされて生成されるプログラムはFirstUnoContact、FirstLoadComponent、HelloTextTableShapeの3つです。

このうちFirstUnoContactについてJDKのコマンドのMakefileの実行結果を抜き出してみます。

他の二つもFirstUnoContactをそれぞれFirstLoadComponentとHelloTextTableShapeに置換したものと全く同じです。
"C:\Java\JDK17~1.0_1/bin/javac"  -classpath "C:\PROGRA~2\LIBREO~1\URE\java\juh.jar;C:\PROGRA~2\LIBREO~1\URE\java\jurt.jar;C:\PROGRA~2\LIBREO~1\URE\java\ridl.jar;C:\PROGRA~2\LIBREO~1\URE\java\unoloader.jar;C:\PROGRA~2\LIBREO~1\program\classes\unoil.jar;c:/LIBREO~1.1_S/WINexample.out/class/FirstStepsExamples" -d c:/LIBREO~1.1_S/WINexample.out/class/FirstStepsExamples FirstUnoContact.java
"C:\Java\JDK17~1.0_1/bin/jar" cvfm FirstUnoContact.jar FirstUnoContact.mf FirstUnoContact.class
"C:\Java\JDK17~1.0_1/bin/jar" uvf c:/LIBREO~1.1_S/WINexample.out/class/FirstStepsExamples/FirstUnoContact.jar -C ../../../classes com/sun/star/lib/loader/Loader.class -C ../../../classes com/sun/star/lib/loader/Loader$Drain.class -C ../../../classes com/sun/star/lib/loader/Loader$CustomURLClassLoader.class -C ../../../classes com/sun/star/lib/loader/Loader$Drain.class -C ../../../classes com/sun/star/lib/loader/InstallationFinder.class -C ../../../classes com/sun/star/lib/loader/InstallationFinder$StreamGobbler.class -C ../../../classes com/sun/star/lib/loader/WinRegKey.class -C ../../../classes com/sun/star/lib/loader/WinRegKeyException.class -C ../../../classes win/unowinreg.dll

javacでソースファイル.javaをクラスファイル.classにコンパイルする


"C:\Java\JDK17~1.0_1/bin/javac"  -classpath "C:\PROGRA~2\LIBREO~1\URE\java\juh.jar;C:\PROGRA~2\LIBREO~1\URE\java\jurt.jar;C:\PROGRA~2\LIBREO~1\URE\java\ridl.jar;C:\PROGRA~2\LIBREO~1\URE\java\unoloader.jar;C:\PROGRA~2\LIBREO~1\program\classes\unoil.jar;c:/LIBREO~1.1_S/WINexample.out/class/FirstStepsExamples" -d c:/LIBREO~1.1_S/WINexample.out/class/FirstStepsExamples FirstUnoContact.java
javac ツールは、Java プログラミング言語で記述されたクラスとインタフェースの定義を読み取り、バイトコードのクラスファイルにコンパイルします。
javac - Java プログラミング言語コンパイラ
ここで使っているjavacのオプションと引数をみていきます。

-cp path または -classpath path

ソースファイル.javaで参照されているクラスが置いてある場所を指定します。

C:\PROGRA~2\LIBREO~1\URE\java\juh.jar
C:\PROGRA~2\LIBREO~1\URE\java\jurt.jar
C:\PROGRA~2\LIBREO~1\URE\java\ridl.jar
C:\PROGRA~2\LIBREO~1\URE\java\unoloader.jar
C:\PROGRA~2\LIBREO~1\program\classes\unoil.jar
c:/LIBREO~1.1_S/WINexample.out/class/FirstStepsExamples

FirstUnoContact.javaのコンパイルではこの6個が指定されています。

(一番最後のパスはいらないような気もしますけど次の-d directory オプションでコンパイルしたクラスファイルの出力先をソースファイル.javaとは別にするときは自分自身のクラスへの参照に必要なようです。2015.2.15追記-sourcepath オプションがないときはソースファイルもユーザークラスパスから検索されるのでソースファイルのパスとして含まれているのかもしれません。)

OpenOffice.orgのDeveloper's Guideに書いてあるIDEの設定とはjuh.jr、jurt.jar、ridl.jarの3つしか一致しません。(Configuration - Apache OpenOffice Wiki)

日本語版にもJava UNO クラス・ファイルの使用に<OfficePath>/program/classesにあるすべてのjarファイルをマウントするように書いてあるのですがC:\Program Files (x86)\LibreOffice 4\program\classesにはjuh.jr、jurt.jar、ridl.jarのファイルが見当たりません。

NetBeansやEclipseなどのIDEを使うときはそれでうまくいくのかもしれません。

今回Developer's Guideに書いてある通りのIDEでのコンパイルを試みずに、Makefileを使ってコンパイルから取り掛かった理由は、英語版と日本語版を読んでもLibreOfficeでうまくいく自信がなかったからです。

-d directory

コンパイルしたクラスファイルの出力先をソースファイル.javaとは別の場所にしたいときにこのオプションを指定します。
注: -d で指定したディレクトリはユーザークラスパスに自動的には追加されません。
javac - Java プログラミング言語コンパイラ
こうやってわざわざ注釈が書いてあるということは-d directory で指定したパスを-classpath path に追加しろ、と読み取れますけどどうなんでしょう。

FirstStepsのMakefileではそうしてありますね。
-d c:\myclasses と指定した場合、クラスの名前が com.mypackage.MyClass であると、クラスファイルは c:\myclasses\com\mypackage\MyClass.class になります。
javac - Java プログラミング言語コンパイラ
-d directory directory は作成しておかないといけませんが、その下の階層のディレクトリはクラスの名前に合わせて作成してくれるようです。

引数

最後にソースファイル.java、FirstUnoContact.javaが引数になっています。

jarでmfファイルとclassファイルをまとめてjarファイルを作成


"C:\Java\JDK17~1.0_1/bin/jar" cvfm FirstUnoContact.jar FirstUnoContact.mf FirstUnoContact.class

jar ツールは、複数のファイルを 1 つの JAR アーカイブファイルに結合します。
jar - Java ARchive ツール
このjarコマンドはオプションで機能が変わります。

ここではcvfmのオプションを使っています。

cはjarファイルの新規作成をします。

vは結果の詳細をコマンドウィンドウに出力します、

fはjarファイル名を指定することを宣言します。

mはマニフェストファイル.mfを組み込むことを宣言します。

fとmの順番とその後に書くjarファイル名とmfファイル名の順番は一致させないといけません。

最後にjarファイル名にまとめるクラスファイル名を続けます。

マニフェストファイル.mfでjarファイルの中身に関する定義をする


jarファイルを作るときにマニフェストファイルFirstUnoContact.mfというのが登場しました。

Makefileのなかのルールで生成しています。

内容は以下のようになっています。

Main-Class: com.sun.star.lib.loader.Loader

Name: com/sun/star/lib/loader/Loader.class
Application-Class: FirstUnoContact

マニフェストファイルまたは署名ファイルに含まれる情報は、RFC822 の規定に従い、いわゆる「名前: 値」ペアとして表現されます。 「名前: 値」ペアは、ヘッダーまたは属性とも呼ばれます。
名前-値ペアのグループを「セクション」と呼びます。セクションはほかのセクションと空白行で分けられます。
JAR ファイルの仕様
ということでFirstUnoContact.mfには2つのセクションがあり、それぞれ1個と2個の属性があることになります。

マニフェストファイルの先頭のセクションはメインセクションといいます。

メインセクションにはメイン属性が定義されます。
 スタンドアロンアプリケーションに対して定義する属性。
この属性は、Java ランタイムから「java -jar x.jar」によって直接呼び出された実行可能 jar ファイルに含まれる、スタンドアロンアプリケーションによって使われる
    Main-Class:
    この属性の値には、起動時に起動ツールによってロードされるメインアプリケーションのクラスの相対パスを定義する。この値には、クラス名に拡張子「.class」が付いていてはならない
JAR ファイルの仕様
FirstUnoContact.mfのメインセクションにあるメイン属性は以下だけです。

Main-Class: com.sun.star.lib.loader.Loader

これはjava -jar FirstUnoContact.jarが実行されたときに起動されるクラスがcom.sun.star.lib.loader.Loaderであると定義しています。

メインセクション以外のセクションは個別セクションといいます。

Name: com/sun/star/lib/loader/Loader.class
Application-Class: FirstUnoContact

個別セクションはjarファイルに格納されているファイルの属性を個別に定義します。

個別セクションにある属性はエントリ別属性といいます。

個別セクションの先頭は必ずName: 属性で始まりそこでjarファイルの中のファイルを指定します。

FirstUnoContact.mfではcom/sun/star/lib/loader/Loader.classについてエントリ別属性を定義しています。(このcom/sun/star/lib/loader/Loader.classはあとのコマンドでFirstUnoContact.jarに追加します。)

エントリ別属性はそのエントリでメイン属性を上書きできますが、FirstUnoContact.mfではApplication-Class: というcom/sun/star/lib/loader/Loader.class固有の属性を定義しています。

Application-Class: についてはTransparent Use of Office UNO Components - Apache OpenOffice Wikiに解説があります。

メイン属性のMain-Class: で呼ばれたcom.sun.star.lib.loader.Loader.mainがApplication-Class: をみてFirstUnoContactのメインメソッドを呼び出す仕組みになっています。

jarファイルにさらにクラスファイルを追加する


"C:\Java\JDK17~1.0_1/bin/jar" uvf c:/LIBREO~1.1_S/WINexample.out/class/FirstStepsExamples/FirstUnoContact.jar -C ../../../classes com/sun/star/lib/loader/Loader.class -C ../../../classes com/sun/star/lib/loader/Loader$Drain.class -C ../../../classes com/sun/star/lib/loader/Loader$CustomURLClassLoader.class -C ../../../classes com/sun/star/lib/loader/Loader$Drain.class -C ../../../classes com/sun/star/lib/loader/InstallationFinder.class -C ../../../classes com/sun/star/lib/loader/InstallationFinder$StreamGobbler.class -C ../../../classes com/sun/star/lib/loader/WinRegKey.class -C ../../../classes com/sun/star/lib/loader/WinRegKeyException.class -C ../../../classes win/unowinreg.dll
jar uvfで先ほど作成したjarファイルにファイルを追加しています。

uはファイルを更新するオプション、vfは作成時と同じでvで結果の詳細を出力、fでjarファイル名を指定することを表します。

uvfに続くc:/LIBREO~1.1_S/WINexample.out/class/FirstStepsExamples/FirstUnoContact.jarが追加先のjarファイルです。

次に追加するファイルが続きます。

-C ../../../classes com/sun/star/lib/loader/Loader.class
-C ../../../classes com/sun/star/lib/loader/Loader$Drain.class
-C ../../../classes com/sun/star/lib/loader/Loader$CustomURLClassLoader.class
-C ../../../classes com/sun/star/lib/loader/Loader$Drain.class
-C ../../../classes com/sun/star/lib/loader/InstallationFinder.class
-C ../../../classes com/sun/star/lib/loader/InstallationFinder$StreamGobbler.class
-C ../../../classes com/sun/star/lib/loader/WinRegKey.class
-C ../../../classes com/sun/star/lib/loader/WinRegKeyException.class
-C ../../../classes win/unowinreg.dll

これは-Cというオプションを使って追加しています。

-C  dir
    jar コマンドの実行中に後続の inputfiles 引数を処理するときに、一時的にディレクトリを変更します (cd dir)。
jar - Java ARchive ツール

具体的に追加している一つ目のファイルについてみてみます。

-C ../../../classes com/sun/star/lib/loader/Loader.class

まず-Cに続くディレクトリに移動します。

cd ../../../classes

これはMakefileの場所からたどりますからC:\Program Files (x86)\LibreOffice 4\sdk\examples\DevelopersGuide\FirstStepsから3階層上がったところにあるclassesというディレクトリ、C:\Program Files (x86)\LibreOffice 4\sdk\classesに移動します。

tree /f のコマンドでこのフォルダをみてみると以下のようになっています。

C:\Program Files (x86)\LibreOffice 4\sdk\classes>tree /f
├─com
│  └─sun
│      └─star
│          └─lib
│              └─loader
│                      InstallationFinder$StreamGobbler.class
│                      InstallationFinder.class
│                      Loader$CustomURLClassLoader.class
│                      Loader$Drain.class
│                      Loader.class
│                      WinRegKey.class
│                      WinRegKeyException.class

└─win
        unowinreg.dll

この場所からloaderにあるLoader.classを取り込みます。

同じようにして全部で9つのファイルをFirstUnoContact.jarに取り込んでいます。

これらのファイルが何をしているのかの解説はTransparent Use of Office UNO Componentsにあります。

マニフェストファイルのApplication-Class:に書かれたFirstUnoContactがLibreOfficeで実行できるように環境を整えるものです。

これでFirstUnoContact.jarの完成です。

完成したFirstUnoContact.jarの中身をみてみる


jarファイルはzip形式になので拡張子をjarからzipに変更して解凍すると中身がみれます。

C:\libreoffice4.1_sdk\WINexample.out\class\FirstStepsExamples\FirstUnoContact.zip>tree /f
│  FirstUnoContact.class

├─com
│  └─sun
│      └─star
│          └─lib
│              └─loader
│                      InstallationFinder$StreamGobbler.class
│                      InstallationFinder.class
│                      Loader$CustomURLClassLoader.class
│                      Loader$Drain.class
│                      Loader.class
│                      WinRegKey.class
│                      WinRegKeyException.class

├─META-INF
│      MANIFEST.MF

└─win
        unowinreg.dll


FirstUnoContact.classはFirstUnoContact.javaのコンパイルした結果です。

マニフェストファイルFirstUnoContact.mfはMANIFEST.MFと名前が変わってMETA-INFフォルダに入っています。

他は-C  dirオブションで取り込んだファイルが元のフォルダを保ったまま取り込まれています。

参考にしたサイト


javac - Java プログラミング言語コンパイラ
Java SE 6のマニュアルです。

Configuration - Apache OpenOffice Wiki
OpenOffice.org SDKでのIDEの設定

Java UNO クラス・ファイルの使用
OpenOffice.org SDKでのIDEの設定、日本語版。

javac - Java プログラミング言語コンパイラ
javacのマニュアル

jar - Java ARchive ツール
jarのマニュアル

JAR ファイルの仕様
マニフェストファイルについての解説があります。

Transparent Use of Office UNO Components - Apache OpenOffice Wiki
マニフェストファイルに書くエントリ別属性Application-Class: の解説

Apache OpenOffice Developer's Guide - Apache OpenOffice Wiki
OpenOffice.org3.1のDeveloper's Guide

次の関連記事:LibreOffice(23)FirstStepsのMakefileの出力ログ

PR

0 件のコメント:

コメントを投稿