KNIMEエクステンション開発 - Maven編

Mavenを使って、さくっとKNIMEエクステンションを開発する手段をテンプレート化(maven archetypeを作成)したので共有します。

以下のような人に有用だと思います。

  • KNIMEエクステンションのビルドを自動化したい
  • KNIMEエクステンション開発で依存ライブラリの管理にうんざりしている
  • KNIMEエクステンション開発を既存のMavenのビルドシステムに取り込みたい

プロジェクト作成

以下のコマンドを適宜変更して実行してください。

mvn archetype:generate \
    -DarchetypeGroupId=jp.uphy.knime.archetypes \
    -DarchetypeArtifactId=node-extension \
    -DarchetypeVersion=1.0.0 \
    -DgroupId=com.example \
    -DartifactId=com.example.foo \
    -Dversion=1.0.0 \
    -DnodeName=Foo \
    -DarchetypeRepository=http://uphy.github.io/knime-node-extension-archetype \
    -DinteractiveMode=false

上記コマンドで指定しているシステムプロパティ(-D~)について

  • artifactIdは、Mavenらしくはないですが、groupIdも含めた名前で指定することを推奨します*1
  • versionは、三桁(x.y.z)にしてください。また、SNAPSHOTを付ける場合には注意事項のバージョンに関して注意してください。めんどくさいので、SNAPSHOTは付けないことを推奨します。
  • nodeNameには、ノードの名前を指定してください。クラス名の接頭語にもなるので、アルファベットでキャメルケースで入力することを推奨します。

以降の説明では、上記のコマンドで作成したプロジェクト(pom.xmlのartifactId)をcom.example.fooとします。

ビルド

以下を実行します。

cd com.example.foo
mvn clean install

二回目以降であれば、-oオプションを付ければ高速化*2できます。

開発環境

KNIMEエクステンションはEclipse Pluginなので、Eclipseで開発するのが素直だと思います。
なのでここではEclipseを使って開発する方法を説明します。

Eclipse設定ファイルの生成

次のコマンドを実行して、Eclipseの設定ファイルを生成します。

cd com.example.foo
mvn eclipse:eclipse

このコマンドで、pom.xmlに記載された依存ライブラリの絶対パスEclipseプロジェクトのクラスパスとして追加してくれたり、OSGiモジュールのMETA-INF/MANIFEST.MFのBUILD-CLASSPATH等を追加してくれたり、手作業では面倒なことをいろいろしてくれます。

注意

  • pom.xmlのversionに*-SNAPSHOTを指定している場合は、上記実行後、MANIFEST.MFを書き換える必要があります。*3
  • mvn eclipse:eclipseはメンテされていません。*4

プロジェクトのインポート

com.example.fooディレクトリをEclipseプロジェクトとしてインポートしてください。

  1. KNIME SDK *5をインストール。
  2. KNIME SDKを起動
  3. FileメニューのImportをクリック
  4. General > Existing Projects into WorkspaceをクリックしてNext
  5. Select root directory:に、com.example.fooのディレクトリを選択して、Next

これでKNIME SDK上にcom.example.fooが正しくインポートされたと思います。

実行

プロジェクトを右クリックし、Run As > Eclipse Applicationをクリックすると実行できます。

依存ライブラリの追加

  1. KNIME SDKを終了
  2. pom.xmldependencyを追加。
  3. mvn eclipse:eclipseを実行。ここの注意事項に注意
  4. KNIME SDKを起動

以上です。

*1:Eclipseプラグインのビルドに用いているtychoの制約上、artifactIdがOSGi BundleのSymbolicNameになるため

*2:このプロジェクト以下でmvnコマンドを実行すると、KNIMEのp2リポジトリを毎回見にいってしまって、時間がかかります。
一回目のビルドであれば当然必要なのですが、二回目以降であれば"mvn -o clean install"のようにオフラインオプション(-o)を指定することで高速化出来ます。

*3:実行すると、META-INF/MANIFEST.MFのファイルが書き換えられて、Bundle-Versionにpom.xmlのversionが入力されます。 Bundle-Versionは、pom.xmlのversionに合わせ、SNAPSHOTをqualifierに置き換えた文字にしてください。(Eclipse Pluginのビルドに用いているtychoの制約上)
例えば、pom.xml1.0.0-SNAPSHOTを指定していた場合は、MANIFEST.MFのBundle-Versionには、1.0.0.qualifierを指定してください。

*4:eclipse:eclipseは、これです。タイトルにRETIREDと書いてある通り、もうこのプラグインはメンテされません。
Eclipseで、Mavenの依存性と同期させる方法で、これより導入が容易で効率の良いものを知らないので、やむを得ず使ってます。
他の方法としては、"tycho pom-first"なんかをキーワードとしてぐぐるといいと思います。さらに別の方法として、maven-dependency-pluginのcopy-dependenciesを使って依存ライブラリをプロジェクトにコピーしてくるという手もありますが、うーんナンセンス

*5:KNIME SDKは、KNIMEプラグイン開発のためのEclipseプラグインをインストール済みのEclipseです。これを用いずとも、EclipseにKNIMEプラグイン開発のためのEclipseプラグインをインストールするという手もあります。例えばKNIME 3.3ならこのリポジトリからインストール可能。