調査の結果、次のアプローチが最善のように思われるという結論に達しました。
some / subpackage / Util.groovy
@GrabResolver(name = 'nexus', root = 'https://local-nexus-server:8443/repository/maven-public', m2Compatible = true)
@Grab('com.google.errorprone:error_prone_annotations:2.1.3')
@Grab('com.google.guava:guava:23.0')
@GrabExclude('com.google.errorprone:error_prone_annotations')
import com.google.common.base.Strings
class Util {
void msg(int a, String b, Map c) {
println 'Message printed by msg method inside Util.groovy'
println "Print 5 asterisks using the Guava dependency ${Strings.repeat("*", 5)}"
println "Arguments are a=$a, b=$b, c=$c"
}
}
example.groovy
#!/usr/bin/env groovy
Class clazz = new GroovyClassLoader().parseClass("${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy" as File)
GroovyObject u = clazz.newInstance()
u.msg(1, 'b', [a: 'b', c: 'd'])
example.groovy
スクリプトを実行するには、スクリプトをシステムパスに追加し、任意のディレクトリから入力します。
example.groovy
スクリプトは次のように出力します。
Message printed by msg method inside Util.groovy
Print 5 asterisks using the Guava dependency *****
Arguments are a=1, b=b, c=[a:b, c:d]
上記の例は、次の環境でテストされています。 Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
この例は、次のことを示しています。
Util
Groovyスクリプト内でクラスを使用する方法。
Util
呼び出すクラスGuava
としてそれを含めることによって、サードパーティのライブラリをGrape
依存(@Grab('com.google.guava:guava:23.0')
)。
Util
クラスは、サブディレクトリに置くことができます。
Util
クラス内のメソッドに引数を渡す。
追加のコメント/提案:
- groovyスクリプト内で再利用可能な機能を使用するには、常にgroovyスクリプトではなくgroovyクラスを使用してください。上記の例では、Util.groovyファイルで定義されているUtilクラスを使用しています。再利用可能な機能にgroovyスクリプトを使用すると問題が発生します。たとえば、groovyスクリプトを使用する場合、Utilクラスはを使用してスクリプトの下部でインスタンス化する必要があります
new Util()
が、最も重要なのは、Util.groovy以外の名前のファイルに配置する必要があることです。groovyスクリプトとgroovyクラスの違いの詳細については、スクリプトとクラスを参照してください。
- 上記の例では、の
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
代わりにパスを使用しています"some/subpackage/Util.groovy"
。これにより、Util.groovy
ファイルが常にexample.groovy
現在の作業ディレクトリではなくgroovyスクリプトの場所()に関連して検出されることが保証されます。たとえば、を使用"some/subpackage/Util.groovy"
すると、で検索されWORK_DIR/some/subpackage/Util.groovy
ます。
- Javaクラスの命名規則に従って、groovyスクリプトに名前を付けます。私は個人的に、スクリプトが大文字の小文字ではなく小文字で始まる小さな逸脱を好みます。たとえば、
myScript.groovy
はスクリプト名、MyClass.groovy
はクラス名です。my-script.groovy
結果のクラスには有効なJavaクラス名がないため、特定のシナリオでは名前付けによりランタイムエラーが発生します。
- JVMの世界では一般に、関連する機能はJSR 223:Scripting for the Javaと呼ばれています。特にgroovyでは、この機能はGroovy統合メカニズムと呼ばれます。実際、同じアプローチを使用して、GroovyまたはJava内から任意のJVM言語を呼び出すことができます。このようなJVM言語の注目すべき例としては、Groovy、Java、Scala、JRuby、JavaScript(Rhino)があります。