Symfoware

Symfowareについての考察blog

Groovy学習10 別のファイルに記載したクラスやメソッドを使用する

Groovyスクリプトから、別のファイルに記載しているクラスやメソッドを使用する方法を調べてみました。

groovyスクリプトから、別のgroovyスクリプトを呼び出す方法
http://genzou-postit.blogspot.jp/2008/01/groovygroovy.html

こちらを参考にさせて頂きました。

なお、実行はUbuntu 12.10で行なっています。




パターン1 staticメソッド



実行するスクリプトファイルは「sample.groovy」
呼び出したいメソッドを記載したファイルは「Called.groovy」
というファイル名にし、同じディレクトリに配置しています。


何も考えず、sample.groovyからCalled.groovyに記載したメソッドを呼びだすサンプルはこちら。
※このサンプルは動作しません。

・sample.groovy


  1. //Called.groovyファイルに記載した関数を呼び出す
  2. Called.sayHello('Symfoware')





・Called.groovy


  1. // Called.groovyの内容
  2. void sayHello(name) {
  3.     println 'Hello, ' + name
  4. }




実行してみると、こんなエラーになります。


$ groovy sample.groovy
Caught: groovy.lang.MissingMethodException: No signature of method: static Called.sayHello() is applicable for argument types: (java.lang.String) values: [Symfoware]
Possible solutions: sayHello(java.lang.Object)
groovy.lang.MissingMethodException: No signature of method: static Called.sayHello() is applicable for argument types: (java.lang.String) values: [Symfoware]
Possible solutions: sayHello(java.lang.Object)
    at sample.run(sample.groovy:4)





呼び出される側がstaticメソッドならOKみたいなので、Called.groovyを修正。

・Called.groovy


  1. // Called.groovyの内容
  2. static void sayHello(name) {
  3.     println 'Hello, ' + name
  4. }




あっさり実行出来ました。


$ groovy sample.groovy
Hello, Symfoware






パターン2 クラスオブジェクト



まず、ダメなパターン。

・sample.groovy


  1. //Called.groovyファイルに記載した関数を呼び出す
  2. called = new CalledSample()
  3. called.sayHello('Symfoware')




・Called.groovy


  1. // Called.groovyの内容
  2. class CalledSample {
  3.     void sayHello(name) {
  4.         println 'Hello, ' + name
  5.     }
  6. }




実行結果


$ groovy sample.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/home/baranche/dev/groovy/sample.groovy: 4: unable to resolve class CalledSample
@ line 4, column 10.
called = new CalledSample()
            ^

1 error




Javaと同様に、ファイル名とクラス名を一致させていないと探せません。



・sample.groovy


  1. //Called.groovyファイルに記載した関数を呼び出す
  2. called = new Called()
  3. called.sayHello('Symfoware')




・Called.groovy


  1. // Called.groovyの内容
  2. class Called {
  3.     void sayHello(name) {
  4.         println 'Hello, ' + name
  5.     }
  6. }




実行結果


$ groovy sample.groovy
Hello, Symfoware







パターン3 パッケージ名あり



Calledクラスをdemoパッケージとしてみます。

・Called.groovy


  1. // Called.groovyの内容
  2. package demo
  3. class Called {
  4.     void sayHello(name) {
  5.         println 'Hello, ' + name
  6.     }
  7. }




sample.groovyを変更せずに実行すると、こんなエラーになりました。


$ groovy sample.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Compilation incomplete: expected to find the class Called in file:/home/baranche/dev/groovy/Called.groovy, but the file contains the classes: demo.Called

1 error



demo.Calledなら見つかったよとのこと。


じゃあってことで、sample.groovyに「import demo」を追加してみます。


  1. //Called.groovyファイルに記載した関数を呼び出す
  2. import demo
  3. called = new Called()
  4. called.sayHello('Symfoware')




エラー


$ groovy sample.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/home/baranche/dev/groovy/sample.groovy: 4: unable to resolve class demo
@ line 4, column 1.
import demo
^

1 error




このパターンは?


  1. //Called.groovyファイルに記載した関数を呼び出す
  2. called = new demo.Called()
  3. called.sayHello('Symfoware')




エラー


$ groovy sample.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/home/baranche/dev/groovy/sample.groovy: 4: unable to resolve class demo.Called
@ line 4, column 10.
called = new demo.Called()
            ^

1 error





正解は、
・demoフォルダを作成し、Called.groovyファイルを移動
・sample.groovyでの呼び出しは、importを使用せず、demo.Called()


・sample.groovy


  1. //Called.groovyファイルに記載した関数を呼び出す
  2. called = new demo.Called()
  3. called.sayHello('Symfoware')




・demo/Called.groovy


  1. // Called.groovyの内容
  2. package demo
  3. class Called {
  4.     void sayHello(name) {
  5.         println 'Hello, ' + name
  6.     }
  7. }




これで実行出来ました。


$ groovy sample.groovy
Hello, Symfoware






groovyスクリプトをコンパイルして、classやjarにしておいて呼び出す方法が主流のようなので、
この方法についても調べてみたいと思います。





その他のメモ書き。

Ubuntu 12.10にGroovy 2.1.9をインストールする(GVM:Groovy enVironment Manager使用)
Groovy学習1 groovyシェル、Hello, World、変数、リストとマップ
Groovy学習2 クロージャ、ファイル処理、文字列処理
Groovy学習3 正規表現
Groovy学習4 正規表現を使用し、データをまとめて取り出す
Groovy学習5 使用できる演算子まとめ
Groovy学習6 色々なループの方法
Groovy学習7 List,Range,Map,Dynamic objects (Collections)
Groovy学習8 Collectionsで使用できるメソッド(each,collect,find,findAll,inject,every,any,max,min,join)
Groovy学習9 Groovy SQL
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/12/03(火) 23:46:35|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Groovy学習11 groovycやantでgroovyスクリプトをコンパイルし、classやjarファイルにする | ホーム | Groovy学習9 Groovy SQL>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1179-102afdc4
この記事にトラックバックする(FC2ブログユーザー)