我正在尝试在我的简单Groovy脚本中使用“HTTPBuilder”。当我使用'@Grab'导入依赖项时,一切正常。虽然,我想将jar保存在不同的目录中,并使用classLoader函数导入它。我复制了'http-builder-0.7.jar',将'@Grab'放入我的grape目录并将其粘贴到我的Groovy脚本运行的同一目录中(在Windows上)。然后我注释掉'@Grab'语句并包含classLoader,但是得到了这个错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException: 启动失败:C:\ Groovy Scripts \ test.groovy:9:无法解决 class HTTPBuilder
为什么classLoader不能在脚本中运行?我在使用'@Grab'导入时打印出jar的路径,并且肯定使用了grape目录中的那个。如果我取消注释'@Grab'语句,它会再次起作用。这是小脚本......
//@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.7')
this.getClass().classLoader.rootLoader.addURL(new File("http-builder-0.7.jar").toURL())
//return new File(groovyx.net.http.HTTPBuilder.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
def http = new HTTPBuilder('http://httpbin.org/get')
答案 0 :(得分:0)
如上所述,您最好使用其他方法,例如Gradle的application plugin。
然而,这是你要做的事情的一种方式。
首先,要获取jar和所有依赖项,请考虑以下Gradle import itertools as it
def J_OR_K(P, y_val1, y_val2, j_list, k_list):
for k, v in P:
for x in {y_val1:j_list, y_val2:k_list}[v]:
yield {a,b,x}
def my_func(x, y, j, k):
res = []
# get cartesian product of x, y
prod_xy = it.product(it.product(['LISTA'], x),
it.product(['LISTB'], y))
# get product with EITHER J OR K
for t in J_OR_K(j, k):
res.append(t)
脚本:
build.gradle
如果您运行apply plugin: 'java'
dependencies {
compile 'org.codehaus.groovy.modules.http-builder:http-builder:0.7'
}
repositories {
jcenter()
}
clean {
doLast {
ant.delete(dir: 'runtime')
}
}
task getDeps(type: Copy) {
from sourceSets.main.runtimeClasspath
into 'runtime/'
doFirst {
ant.delete(dir: 'runtime')
ant.mkdir(dir: 'runtime')
}
}
,它会将所有广告内容写入gradle getDeps
。
然后,在Unix终端(例如)中,您可以使用此设置类路径(使用Java 6+中的通配符语法,并假设路径与上面的runtime
相同):
runtime
在同一个终端中,这将有效:
export CLASSPATH=.:"/user/foo/some/path/runtime/*"