在Groovy中包含本地Jars

时间:2017-10-31 16:50:44

标签: java groovy

我正在尝试在我的简单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')

1 个答案:

答案 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/*"