KTable を動かしてみる

KTable を動かしてみる

ソース、サンプルは下記 URL から入手
http://sourceforge.net/projects/ktable/files/

このページの 2.2.0 の Folder を開くと Release_Notes_KTable_2_2_0.txt といったドキュメントがあるが、サンプルの簡単な説明と修正履歴で、使用方法は書いてない。

ただ、SWT をベースにしているので、SWT 関連のクラスと低レベルのネイティブライブラリが動作には必須と思われる。

とりあえず de.kupzog.ktable.examples_2.2.0.jar de.kupzog.ktable_2.2.0.jar
をダウンロード。それぞれには jar ファイルが含まれている。

環境は MacOS X Snow Leopard なので、$ の後のコマンドラインbash の物。


$ for f in de*jar; do echo === $f ===; jar tf $f; done
=== de.kupzog.ktable.examples_2.2.0.jar ===
META-INF/
META-INF/MANIFEST.MF
ktable_examples.jar
=== de.kupzog.ktable_2.2.0.jar ===
META-INF/
META-INF/MANIFEST.MF
KTable.jar

それぞれを展開。


$ for f in de*jar; do jar xf $f; done

ktable_examples.jar のリストを出してみてもどれが main かわからないし、manifest にも Main-Class が定義してない模様。


$ jar tf ktable_examples.jar

$ java -jar de.kupzog.ktable.examples_2.2.0.jar
Failed to load Main-Class manifest attribute from
de.kupzog.ktable.examples_2.2.0.jar

de.kupzog.examples.TextModelExample を main に指定して起動してみても main がないと出てくる。


$ java -cp ktable_examples.jar:KTable.jar de.kupzog.examples.TextModelExample
Exception in thread "main" java.lang.NoSuchMethodError: main

ktable_examples.jar を展開して main method を持つクラスを探す。


$ jar xf ktable_examples.jar

$ find de -name '*.class' | sed 's!/!.!g;s/\.class$//' | while read cn; do javap -classpath ktable_examples.jar $cn | grep main && echo "=== $cn ==="; done
public static void main(java.lang.String[]);
=== de.kupzog.examples.ExampleGUI ===

de.kupzog.examples.ExampleGUI のみ。

/Users/test/local/eclipseeclipse がインストールされているとして、次のような build.xml を作成し、ant での実行を試みる。



















これでウィンドウは出てくるけど中身が描画されない。SWT のネイティブライブラリに関するパスなどは設定していないのでそのせいかも。ただ、lsof で eclipse がロードしている swt のライブラリらしき物を探しても、/private/var/folders… のしたの物ぐらいしか見当たらない。

SWT をつかうアプリケーションを実行するための最小のネイティブ部分を含んだライブラリというのもあるかもと思いながら、いっその事 Eclipse 上での実行の方が簡単そうという事で方針変更。

Eclipse を起動し、Java Project を ktableex という名前で作成。Library に KTable.jar, ktable_examples.jar を追加(Referenced Libraries を右クリックして  Build Path -> Configure Build Path の画面で External jar を追加。プロジェクト ktableex を右クリック、Build Path -> Add External Archives でも同様)。

デモの main を呼び出すプログラムを作成。


public class Main {
public static void main(String[] args) {
de.kupzog.examples.ExampleGUI.main(new String[] {});
}
}

実行してみる(作成した Main クラスを右クリック、Run As -> Java Application)と足りないクラスが実行時にロードできないというエラーになるので、それを含む jar file を探して追加する。


Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite
at Main.main(Main.java:8)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Composite
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 1 more

追加eclipse のインストールされたディレクトリの一つ上の階層から次のコマンドで plugins の下の jar file を探し、各ファイルのリストを jar で取って、ここでは wigets/Composite を含むファイルがあればそのファイル名を表示する。


$ find eclipse/plugins/ -name '*.jar' | while read p; do jar tf $p | grep swt/widgets/Composite && echo "=== $p ==="; done
org/eclipse/swt/widgets/Composite.class
=== eclipse/plugins//com.google.gwt.eclipse.sdkbundle.macosx_1.7.1.v200909221731/gwt-mac-1.7.1/gwt-dev-mac.jar ===
org/eclipse/swt/widgets/Composite.class
=== eclipse/plugins//org.eclipse.swt.cocoa.macosx_3.5.1.v3555a.jar ===

ここでは GWT のものと eclipse の物が表示された。eclipse の物を使用する。

実際のファイル名はプラットホーム名や、バージョン番号を含んでいるので、Eclipse のバージョンと、かくプラグインのバージョンにより異なってくる。jar file の前半部分が下記の物を追加すると実行できるようになった。

org.eclipse.jface_3.5.1…
org.eclipse.core.commands_…
org.eclipse.core.runtime_3.5.0…
org.eclipse.equinox.common_3.5.1…
org.eclipse.swt

実行結果