在Grails中,如何指定常春藤解析器所需的罐子?

时间:2010-10-22 16:47:10

标签: grails ivy resolver

在grails项目中,我根据参考文档http://www.grails.org/doc/latest/guide/single.html#12.2%20Plugin%20Repositories添加了自定义常春藤解析器。

但是,这个解析器需要jsch和其他一些罐子。如何将它们放在项目的构建类路径中,以便常春藤使用它们?

这是我的BuildConfig.groovy

grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports"
grails.project.war.file = "target/${appName}-${appVersion}.war"

//Configure resolver
def sshResolver = new org.apache.ivy.plugins.resolver.SshResolver()
['libraries', 'builds'].each {
    sshResolver.addArtifactPattern("/home/ivy/[organisation]/[revision]/[artifact].[ext]")
    sshResolver.addIvyPattern("/home/ivy/[organisation]/[revision]/[artifact].[ext]")
}
sshResolver.name = "ssh"
sshResolver.settings = ivySettings

resolver sshResolver

grails.project.dependency.resolution = {
    // inherit Grails' default dependencies
    inherits("global") {
    }
    log "warn" 
    repositories {
        grailsPlugins()
        grailsHome()
        grailsCentral()
        ssh()
    }
    dependencies {
        compile 'someorg:somejar:1.0'
        runtime 'mysql:mysql-connector-java:5.1.13'
    }   
}

4 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并且从Grails用户列表中的Ian Roberts得到了这个答案,这对我有用:

def myCL = new URLClassLoader([new File(
            "${basedir}/lib/the.jar"
        ).toURI().toURL()] as URL[],
        org.apache.ivy.plugins.repository.AbstractRepository.classLoader)
resolver myCL.loadClass('com.whatever.MyResolver').newInstance()

将加载Ivy的类加载器作为父级传递是很重要的,这样它就可以解析Ivy类。

如果您需要加载多个jar(因为您要加载的类依赖于它们),那么将所有文件放在列表中,如下所示:

def myCL = new URLClassLoader([
        "${basedir}/lib/jar1",
        "${basedir}/lib/jar2", // etc.
    ].collect { new File(it).toURI().toURL() } as URL[],
    org.apache.ivy.plugins.repository.AbstractRepository.classLoader)
resolver myCL.loadClass('com.whatever.MyResolver').newInstance()

答案 1 :(得分:0)

似乎有效的另一个选择是使用@Grab。类似的东西:

@Grab(group="com.jcraft",module="jsch",version="0.1.42")
import org.apache.ivy.plugins.resolver.SshResolver

def sshResolver = new SshResolver()
['libraries', 'builds'].each {
    sshResolver.addArtifactPattern("/home/ivy/[organisation]/[revision]/[artifact].[ext]")
    sshResolver.addIvyPattern("/home/ivy/[organisation]/[revision]/[artifact].[ext]")
}
sshResolver.name = "ssh"
sshResolver.settings = ivySettings

resolver sshResolver

如果你的jar不在公共存储库中,那可能会有点棘手。

答案 2 :(得分:-1)

Grails使用常春藤来实现它的依赖管理。您需要做的就是声明您需要的额外库。你尝试过这样的事情:

dependencies {
    ..
    compile 'com.jcraft:jsch:0.1.42'
    ..
}   

答案 3 :(得分:-2)

显然

grails -cp ./lib/jsch.jar 

是答案,而不是我最初尝试过的-classpath或--classpath。

如果有人有更好的答案,我肯定会接受它。

我尝试将jar放在grails / lib中,但是在处理完解析器后会加载它。

我在PreInit.groovy尝试了这个,但也没有运气。

grails.compiler.dependencies = { fileset(file:'${basedir}/lib/jsch.jar') }