この記事では、カスタム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
↩1 | もし、ローカルリポジトリの設定を変更していて、Karaf がそれを見つけることができない場合は、Karafのetc/org.ops4j.pax.url.mvn.cfgファイルに、そのリポジトリの設定を加えてください。 |
---|