首页 文章

包括Groovy中的本地JAR

提问于
浏览
1

我试图在我的简单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:无法解析类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

    如上所述,您最好使用其他方法,例如Gradle的application plugin .

    但是,这是一种做你要求的方法 .

    首先,要获取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终端(例如)中,您可以使用此设置类路径(使用Java 6中的通配符语法,并假设路径与上面的 runtime 相同):

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

    在同一个终端,这将工作:

    import groovyx.net.http.*
    
    def http = new HTTPBuilder('http://httpbin.org/get')
    
    println "Ready."
    

相关问题