前の関連記事: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のオプションと引数をみていきます。
javac - Java プログラミング言語コンパイラ
-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 で指定したディレクトリはユーザークラスパスに自動的には追加されません。こうやってわざわざ注釈が書いてあるということは-d directory で指定したパスを-classpath path に追加しろ、と読み取れますけどどうなんでしょう。
javac - Java プログラミング言語コンパイラ
FirstStepsのMakefileではそうしてありますね。
-d c:\myclasses と指定した場合、クラスの名前が com.mypackage.MyClass であると、クラスファイルは c:\myclasses\com\mypackage\MyClass.class になります。-d directory でdirectory は作成しておかないといけませんが、その下の階層のディレクトリはクラスの名前に合わせて作成してくれるようです。
javac - Java プログラミング言語コンパイラ
引数
最後にソースファイル.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コマンドはオプションで機能が変わります。
jar - Java ARchive ツール
ここでは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
Name: com/sun/star/lib/loader/Loader.class
Application-Class: FirstUnoContact
マニフェストファイルまたは署名ファイルに含まれる情報は、RFC822 の規定に従い、いわゆる「名前: 値」ペアとして表現されます。 「名前: 値」ペアは、ヘッダーまたは属性とも呼ばれます。ということでFirstUnoContact.mfには2つのセクションがあり、それぞれ1個と2個の属性があることになります。
名前-値ペアのグループを「セクション」と呼びます。セクションはほかのセクションと空白行で分けられます。
JAR ファイルの仕様
マニフェストファイルの先頭のセクションはメインセクションといいます。
メインセクションにはメイン属性が定義されます。
スタンドアロンアプリケーションに対して定義する属性。FirstUnoContact.mfのメインセクションにあるメイン属性は以下だけです。
この属性は、Java ランタイムから「java -jar x.jar」によって直接呼び出された実行可能 jar ファイルに含まれる、スタンドアロンアプリケーションによって使われる
Main-Class:
この属性の値には、起動時に起動ツールによってロードされるメインアプリケーションのクラスの相対パスを定義する。この値には、クラス名に拡張子「.class」が付いていてはならない
JAR ファイルの仕様
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
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.dlljar 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
├─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
│
├─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
0 件のコメント:
コメントを投稿