6

Gradle ビルド スクリプトから groovy コマンドライン スクリプトを実行したいと考えています。

Gradleスクリプトでこのコードを使用しています:

def groovyShell = new GroovyShell();
groovyShell.run(file('script.groovy'), ['arg1', 'arg2'] as String[])

私の Groovy スクリプト (script.groovy) が CliBuilder クラスを使用するまで、問題なく動作します。次に、次の例外が発生します。

org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException ... 原因: java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException

同様の問題やエラーを抱えている人をたくさん見つけましたが、読んだ多数の投稿から「解決策」を抽出するのは困難でした。多くの人が commons-cli jar をクラスパスに配置することを提案しましたが、GroovyShell に対してそうすることが私にはまったくわかりませんでした。また、script.groovy で必要なライブラリに対して @Grapes と @Grab を既に宣言しているので、必要なものはすべて含まれているはずです。

4

2 に答える 2

8

この受け入れられていない SO answerのおかげで、私は最終的に私がしなければならないことを見つけました:

//define our own configuration
configurations{
    addToClassLoader
}
//List the dependencies that our shell scripts will require in their classLoader:
dependencies {
    addToClassLoader group: 'commons-cli', name: 'commons-cli', version: '1.2'
}
//Now add those dependencies to the root classLoader:
URLClassLoader loader = GroovyObject.class.classLoader
configurations.addToClassLoader.each {File file ->
    loader.addURL(file.toURL())
}

//And now no more exception when I run this:
def groovyShell = new GroovyShell();
groovyShell.run(file('script.groovy'), ['arg1', 'arg2'] as String[])

classLoaders の詳細と、このソリューションが機能する理由については、このフォーラムの投稿 を参照してください。

スクリプト作成をお楽しみください。

(私自身の質問に答えて私に反対票を投じる前に、これを読んでください)

于 2012-12-07T12:28:30.927 に答える
2

これを行うための代替手段は次のとおりです。

buildScript {
  repositories { mavenCentral() }
  dependencies {
    classpath "commons-cli:commons-cli:1.2"
  }
}

def groovyShell = new GroovyShell()
....

これにより、commons-cliの依存関係が、ビルドされるプロジェクトのクラスパスではなく、ビルドスクリプトのクラスパスになります。

于 2012-12-07T12:49:59.677 に答える