7

groovyスクリプトがクロスカッティングの問題に対処するためのインクルードメカニズムを探しています。groovyはインクルードメカニズムを提供していますか?

私の例では、WebサービスのエンドポイントをGroovyスクリプトとして持ち、Webサービスプロトコルにログインします。そのためには、暗黙のオブジェクト(フレームワークから取得)を使用してロギングステートメントを作成します。

しかし、これをすべてのWebサービスエンドポイントでコード化すると、これは定型的なコードです。

私たちはPHPでinclude()のようなものを探しています。これには他のGroovyスクリプトも含まれています。これを行う方法はありますか?評価(ファイル)機能で

答えて

1

すでに「クロスカット-懸念は」私は、あなたのWebサービスを傍受する必要があると言うだろう言及しているのではAOPスタイルを呼び出します(インクルード機構ではない)。

GrailsはSpring frameworkと完全に統合されているため、Spring AOP機能を利用するための良い選択肢となります。 grails公式ガイドからこの章を見てください: http://grails.org/doc/latest/guide/14.%20Grails%20and%20Spring.htmlと単語AOPを検索してください。

多分、AOPをやっているpurely groovy wayがありますが、私はgrailsとspringを使います。

1

ルック:

Object evaluate(File file) 

http://groovy.codehaus.org/api/groovy/lang/Script.html

+1

Scriptオブジェクトを作成または取得する方法が説明されていない場合、そのクラスは抽象クラスであるため、役に立たない場合があります。 – Blaine

+0

一般に、これを呼び出すコードは、匿名の 'Script'サブクラスのインスタンスにコンパイルされます。 –

10

Groovyは、そのファイルをオブジェクトとして扱います(自動ラッピングのように考えます)。また、Javaクラスパス内のすべての.groovyファイルをクラスとして使用できます。あなたは、この内部のようなものが含まれているファイルutil.groovy、持っているのであれば:

println util.AuxMethod() 

それだ:

def static AuxMethod() { 
    return "Hello World" 
} 

をあなただけの書き込みを別のファイルからそれを呼び出します。再度、util.groovyファイルがクラスパスにあることを確認してください。

+0

Groovyスクリプトがオブジェクト指向のクラスである場合にのみうまくいくと思います。通常の機能スクリプトでは、おそらく動作しませんか? – djangofan

+2

この例は、util.groovyスクリプトが大文字のUtil.groovyで名前が変更され、それに対応して参照が 'println Util.AuxMethod()'に変更された場合、少なくともWindowsでは動作します。 – Blaine

+3

前回のコメントをフォローアップします。これはUNIXにも適用されます。私は "util"を "Util"に改名するまで動作しません。また、Java + Groovyの開発者はJavaの慣習に準拠するようにメソッド宣言を記述することがほとんどです。static def auxMethod。私。型名の前に「静的」があり、すべてのメソッドは小文字で始まります(たとえば、java.util.Collectionsの静的メソッドのトンを参照してください)。 – Blaine

2

、u.groovyに元の引数を渡して、現在のスクリプトからスクリプトu.groovyを呼び出す明らか

run(new File('u.groovy'), args) 

を実行するには、あなたはまたにしたい任意の文字列引数を送信することができます:

run(new File('u.groovy'), 
     ['one', new File('two.text').absolutePath] as String[]) 
1

私が作成しているドメイン固有の言語についてこれについていくつかの調査を行った。 3つの可能性があります:

  1. 親のgroovyクラスを継承してクラスを作成します。共有クラスを基本クラスに入れます。

  2. http://groovy.codehaus.org/Embedding+Groovyを参照してください。これはすべてのスクリプトが作成されるクラスです。

  3. インポート静的メソッド機能を使用します。これはJavaコンテナ内で行うことができます(http://mrhaki.blogspot.com/2011/06/groovy-goodness-add-imports.htmlを参照)。

これらはすべて素晴らしいです。私の好みはScriptBaseClassです。共通のコードはもちろんのGroovy(ScriptBaseClass グルーヴィーなクラスでなければなりません。これは、Javaクラスにすることはできません。)

である場合、これは最高の作品、これらの項目のすべてで、あなたはまだ、実際に呼び出す必要がありますGroovyコードでよく使われる方法。例:

これはあまりにもひどいことではないと思います。いくつかの種類のプリプロセッサステートメントを追加することとまったく同じです。

最後に、これは皆さんがGroovyコードを呼び出すJavaプログラムにアクセスできることを前提としています。そうでない場合は、引き続き静的インポートを使用できます。余分なコード行です。

import static com.mycompany.mycode.doCommonStuff 
doCommonStuf() 
. 
. do the rest of it here 
. 
関連する問題