java—包括groovy中的本地jar

6vl6ewon  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(328)

我正在尝试在我的简单groovy脚本中使用“httpbuilder”。当我使用'@grab'导入依赖项时,一切正常。不过,我希望将jar保存在不同的目录中,并使用classloader函数导入它。我已经将“@grab”放在grapes目录中的“http-builder-0.7.jar”复制到groovy脚本运行的目录中(在windows上)。然后我注解掉'@grab'语句并包含classloader,但得到以下错误:
org.codehaus.groovy.control.multiplecompilentErrorsException:启动失败: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')
4dbbbstv

4dbbbstv1#

如前所述,明智的做法是使用另一种方法,例如gradle的应用程序插件。
然而,这是一种实现你要求的方法。
首先,要获得jar和所有依赖项,请考虑以下gradle 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 ,它会将所有的jar写入 runtime .
然后,在unix终端中(例如),您可以用这个设置类路径(使用java6+中的通配符语法,并且假设路径是相同的) runtime 同上):

export CLASSPATH=.:"/user/foo/some/path/runtime/*"

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

import groovyx.net.http.*

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

println "Ready."

相关问题