Maven archetypeを使ってカスタムKarafコマンドを作成する

この記事では、カスタムKarafコマンドをMaven architype を使って作成し、それを通して、Karaf のコマンド周りをちょっとだけ覗いてみます。

この記事では、Karaf 3.0.3 と Maven3.0.5 を使っています。

カスタム Karaf コマンドの雛形を作成する

カスタム Karaf コマンドの雛形を作成するための”karaf-command-archetype“という Maven architype が存在します。

次のように実行します。

# mvn archetype:generate \
   -DarchetypeGroupId=org.apache.karaf.archetypes \
   -DarchetypeArtifactId=karaf-command-archetype \
   -DarchetypeVersion=3.0.3 \
   -DgroupId=com.wingnest \
   -DartifactId=custom-command1 \
   -Dversion=1.0.0-SNAPSHOT \
   -Dpackage=com.wingnest.test

この例では、作成するコマンドの ArtifactId を custom-command1 と指定しています。
また、コマンドを実装するJavaクラスのパッケージを -Dpackage で com.wingnest.test と指定しています。

この実行により、次の画面出力がおこなわれます。

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom <<<
[INFO] 
[INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] Archetype repository missing. Using the one from [org.apache.karaf.archetypes:karaf-command-archetype:3.0.2] found in catalog remote
[INFO] Using property: groupId = com.wingnest
[INFO] Using property: artifactId = custom-command1
[INFO] Using property: version = 1.0.0-SNAPSHOT
[INFO] Using property: package = com.wingnest.test
Define value for property 'command': : 

この状態で画面出力が止まります。
慌てず、ここでは作成するコマンドの名前を入力します。この例では、”command1″ という名前を入れることで、command1 というコマンドを作成します。

入力を終えると、次のような画面出力が行われまた止まります。ここでは、作成するコマンドの説明を記述します。

Define value for property 'command': : command1
Define value for property 'description': : カスタムコマンドのサンプルです

続いて、次のような画面出力が行われます。

Define value for property 'command': : command1
Define value for property 'description': : カスタムコマンドのサンプルです
Define value for property 'scope': : 

ここで聞かれている scope というものは、コマンドのカテゴリのようなものになります。ここでは、myscope とつけておきます。

このscopeの名前とコマンドの名前を使って、この記事の例では、myscope:command1 というふうに Karafコンソールから呼び出すことができます。myscope というスコープに存在する command1 を呼び出しているわけですね。

さて、scope を指定すると、次のような画面が出力されます。

Confirm properties configuration:
groupId: com.wingnest
artifactId: custom-command1
version: 1.0.0-SNAPSHOT
package: com.wingnest.test
command: command1
description: カスタムコマンドのサンプルです
scope: myscope
 Y: : 

今まで入力した内容が表示されます。表示内容に問題がなければ、Y を入力します。ちなみに、Y以外を入力すると最初から入力しなおしになります。

Y を入力し終えると、次のような出力があり、mvn を実行したディレクトリの下に、custom-command1 というディレクトリが作成されます。

scope: myscope
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: karaf-command-archetype:3.0.3
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.wingnest
[INFO] Parameter: artifactId, Value: custom-command1
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: package, Value: com.wingnest.test
[INFO] Parameter: packageInPathFormat, Value: com/wingnest/test
[INFO] Parameter: package, Value: com.wingnest.test
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: groupId, Value: com.wingnest
[INFO] Parameter: scope, Value: myscope
[INFO] Parameter: description, Value: カスタムコマンドのサンプルです
[INFO] Parameter: command, Value: command1
[INFO] Parameter: artifactId, Value: custom-command1
[INFO] project created from Archetype in dir: /home/gougi/デスクトップ/Karaf/test/custom-command1
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9:28.460s
[INFO] Finished at: Tue Jan 20 16:33:13 JST 2015
[INFO] Final Memory: 15M/240M
[INFO] ------------------------------------------------------------------------
$ ls
custom-command1

とりあえずカスタム Karaf コマンドの雛形をビルドする

作成された custom-command1 ディレクトリに移動して、mvn install を実行します。

$ mvn install
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Apache Karaf :: Shell myscope/command1 Commands 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.7:resources (default-resources) @ custom-command1 ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ custom-command1 ---
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /home/gougi/デスクトップ/Karaf/custom-command1/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.7:testResources (default-testResources) @ custom-command1 ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/gougi/デスクトップ/Karaf/custom-command1/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ custom-command1 ---
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ custom-command1 ---
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-bundle-plugin:2.5.3:bundle (default-bundle) @ custom-command1 ---
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ custom-command1 ---
[INFO] Installing /home/gougi/デスクトップ/Karaf/custom-command1/target/custom-command1-1.0.0-SNAPSHOT.jar to /home/gougi/.m2/repository/com/wingnest/custom-command1/1.0.0-SNAPSHOT/custom-command1-1.0.0-SNAPSHOT.jar
[INFO] Installing /home/gougi/デスクトップ/Karaf/custom-command1/pom.xml to /home/gougi/.m2/repository/com/wingnest/custom-command1/1.0.0-SNAPSHOT/custom-command1-1.0.0-SNAPSHOT.pom
[INFO] 
[INFO] --- maven-bundle-plugin:2.5.3:install (default-install) @ custom-command1 ---
[INFO] Installing com/wingnest/custom-command1/1.0.0-SNAPSHOT/custom-command1-1.0.0-SNAPSHOT.jar
[INFO] Writing OBR metadata
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.640s
[INFO] Finished at: Sun Feb 08 09:53:48 JST 2015
[INFO] Final Memory: 21M/253M
[INFO] ------------------------------------------------------------------------
$ 

上記のような出力がされます。よく見ると、次のような WARNING が出ています。

(省略)
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
(省略)

これは、

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

を加えればよさそうです。

が、問題は起きそうにないので、気にせずこのまま、Karaf に install してみましょう1)もし、ローカルリポジトリの設定を変更していて、Karaf がそれを見つけることができない場合は、Karafのetc/org.ops4j.pax.url.mvn.cfgファイルに、そのリポジトリの設定を加えてください。

$ karaf
        __ __                  ____      
       / //_/____ __________ _/ __/      
      / ,<  / __ `/ ___/ __ `/ /_        
     / /| |/ /_/ / /  / /_/ / __/        
    /_/ |_|\__,_/_/   \__,_/_/         

  Apache Karaf (3.0.3)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.

karaf@root()> install -s mvn:com.wingnest/custom-command1
Bundle ID: 64
karaf@root()> 

ここで、インストールされている Bundle(=OSGiベースのモジュール)の一覧をみてみます。

karaf@root()> bundle:list
START LEVEL 100 , List Threshold: 50
 ID | State   | Lvl | Version        | Name                                           
--------------------------------------------------------------------------------------
64 | Active |  80 | 1.0.0.SNAPSHOT | Apache Karaf :: Shell myscope/command1 Commands
karaf@root()>

インストールはされて、状態も Active となっていて正常に稼働しているようです。

では、myscope:command1を実行してみます。

karaf@root()> myscope:command1
Executing command command1
Option: null
Argument: null
karaf@root()> 

何やら表示され、ちゃんと実行されました。

コマンドに引数とオプションを与えてみる

しかし、よく見ると、Option と Argument の二箇所が null となっていますね。気になるので、自動で生成されたソースをみてましょう。

コマンドのソースは、custom-command1/src/main/java/com/wingnest/test/command1.java になるようです。これをエディタで開いてみましょう。

@Option でオプション、そして @Argument で引数が、それぞれ定義されていて、さらに、それを表示するプログラムになっているようです。

というわけで、次のように Karafコンソールで実行してみます。

すると次のような出力を得られるはずです。

karaf@root()> myscope:command1 -o hoge foobar
Executing command command1
Option: hoge
Argument: foobar
karaf@root()> 

この記事は、ここまで。

Footnotes

Footnotes
1 もし、ローカルリポジトリの設定を変更していて、Karaf がそれを見つけることができない場合は、Karafのetc/org.ops4j.pax.url.mvn.cfgファイルに、そのリポジトリの設定を加えてください。