Gradle 使用 Eclipse Luna 在 GroovyShell 中执行 Groovy 脚本

Gradle execute Groovy script in GroovyShell with Eclipse Luna

我在执行 gradle 任务时收到 ClassNotFoundException: org.apache.ivy.core.report.ResolveReport,该任务使用 Grapes 解决依赖关系。

我正在使用 Eclipse Luna 4.4.0 和一个 Gradle/Groovy 项目 有这个 build.gradle:

apply plugin: 'groovy'
apply plugin:'application'

mainClassName = "de.my.app.package.Main"
version = 0.5

repositories { mavenCentral() }

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.3'
    compile group: 'org.apache.ivy', name:'ivy', version:'2.2.0'
    compile 'commons-io:commons-io:2.4'
    compile 'commons-codec:commons-codec:1.2'
}

task myTask << {
    def groovyShell = new GroovyShell()
    groovyShell.run(file('/src/scripts/groovy/de/my/app/package/scripts/SomeScript.groovy'))
}
classes.finalizedBy(myTask)

我的 Java Build PathProject->Properties 里面看起来是这样的:

这是文件夹 /src/scripts/groovy/de/my/app/package/scripts 中的 SomeScript.groovy

package de.my.app.package.scripts
@Grapes(
@Grab(group='org.eclipse.birt.runtime.3_7_1', module='org.apache.commons.codec', version='1.3.0')
)
@Grapes(
@Grab(group='commons-io', module='commons-io', version='2.4')
)
import org.apache.commons.codec.binary.Hex
println Hex.toString()

奇怪的是从 cmdgroovy SomeScript.groovy 执行 SomeScript.groovy 不会给出错误。所以我猜这是我错过的一些 Eclipse 配置。

SomeScript.groovy 如何被 build.gradle 中的 Gradle run 执行而不引起 ClassNotFoundException: org.apache.ivy.core.report.ResolveReport

我找到了解决问题的方法。我需要这个 build.gradle 文件:

apply plugin: 'groovy'
apply plugin:'application'

mainClassName = "de.my.app.package.Main"
version = 0.5

repositories { mavenCentral() }

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.3'
    compile group: 'org.apache.ivy', name:'ivy', version:'2.2.0'
    compile 'commons-io:commons-io:2.4'
    compile 'commons-codec:commons-codec:1.2'
}

task myTask (type: Exec) {
    def groovyHome = System.getenv("GROOVY_HOME")
    def someScriptPath= new String(project.projectDir.toString()).toString() + "\src\scripts\groovy\de\my\app\package\main\SomeScript.groovy"
    commandLine  "${groovyHome}\bin\groovy.bat", someScriptPath
}
classes.finalizedBy(myTask)

所以我放弃了使用 class GroovyShell 的方法,因为我无法为它正确配置 classPath。

我的脚本现在在每个 运行 之前执行。问题已解决。