Java 在Groovy中包括本地jar

Java 在Groovy中包括本地jar,java,groovy,Java,Groovy,我正试图在我的简单Groovy脚本中使用“HTTPBuilder”。当我使用'@Grab'导入依赖项时,一切正常。不过,我希望将jar保存在不同的目录中,并使用classLoader函数导入它。我已将“@Grab”放在grapes目录中的“http-builder-0.7.jar”复制到Groovy脚本正在运行的同一目录中(在Windows上)。然后我注释掉“@Grab”语句并包含类加载器,但得到以下错误: org.codehaus.groovy.control.multipleCompatio

我正试图在我的简单Groovy脚本中使用“HTTPBuilder”。当我使用'@Grab'导入依赖项时,一切正常。不过,我希望将jar保存在不同的目录中,并使用classLoader函数导入它。我已将“@Grab”放在grapes目录中的“http-builder-0.7.jar”复制到Groovy脚本正在运行的同一目录中(在Windows上)。然后我注释掉“@Grab”语句并包含类加载器,但得到以下错误:

org.codehaus.groovy.control.multipleCompationerErrorSexception: 启动失败:C:\Groovy Scripts\test.Groovy:9:无法解析 类HTTPBuilder

你知道为什么类加载器不能在脚本中工作吗?我用“@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')

如前所述,您最好使用另一种方法,如Gradle的方法

然而,这是实现你要求的一种方法

首先,要获得jar和所有依赖项,请考虑下面的Gradle <代码> Bug .GooLe< /Cord>脚本:

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
,它会将所有jar写入
运行时

然后,在Unix终端(例如)中,您可以使用以下命令设置类路径(使用Java 6+中的通配符语法,并假设路径与上面的
runtime
相同):

在同一终端中,这将起作用:

import groovyx.net.http.*

def http = new HTTPBuilder('http://httpbin.org/get')

println "Ready."

如前所述,您最好使用另一种方法,如Gradle的方法

然而,这是实现你要求的一种方法

首先,要获得jar和所有依赖项,请考虑下面的Gradle <代码> Bug .GooLe< /Cord>脚本:

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
,它会将所有jar写入
运行时

然后,在Unix终端(例如)中,您可以使用以下命令设置类路径(使用Java 6+中的通配符语法,并假设路径与上面的
runtime
相同):

在同一终端中,这将起作用:

import groovyx.net.http.*

def http = new HTTPBuilder('http://httpbin.org/get')

println "Ready."

HttpBuilder可能依赖于其他依赖项。。。这是一个滑坡,有没有办法看看它依赖于什么依赖关系?这会像下载那些JAR并将它们放在同一个目录中一样简单吗?问题是,它是一个依赖关系树,所以它所依赖的东西也会有依赖关系。。。因此,滑坡。您最好使用Grab,或者使用Gradle之类的工具将脚本构建到胖jar中。您是否尝试将此jar放在groovy根文件夹/lib上?HttpBuilder可能依赖于其他依赖项。。。这是一个滑坡,有没有办法看看它依赖于什么依赖关系?这会像下载那些JAR并将它们放在同一个目录中一样简单吗?问题是,它是一个依赖关系树,所以它所依赖的东西也会有依赖关系。。。因此,滑坡。您最好使用Grab,或者使用gradle之类的工具将脚本构建到胖jar中。您是否尝试过将这个jar放在groovy根文件夹/lib上?