1

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

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

这是我的 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

4 回答 4

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 类。

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

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()
于 2011-06-14T16:15:06.370 回答
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 不在公共存储库中,则可能会有点棘手。

于 2011-06-16T00:49:49.447 回答
-1

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

dependencies {
    ..
    compile 'com.jcraft:jsch:0.1.42'
    ..
}   
于 2010-10-22T19:14:19.073 回答
-2

显然

grails -cp ./lib/jsch.jar 

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

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

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

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

grails.compiler.dependencies = { fileset(file:'${basedir}/lib/jsch.jar') } 
于 2010-10-22T20:12:08.980 回答