Domanda

In graal progetto che ho aggiunto un sistema di risoluzione edera personalizzato per la documentazione di riferimento, http://www.grails.org/doc/latest/guide/single.html#12.2%20Plugin%20Repositories .

Tuttavia, questo richiede resolver jsch ed e alcuni altri vasi. Come posso mettere sul accumulo classpath del progetto in modo che l'edera li utilizzerà?

Questa è la mia 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'
    }   
}
È stato utile?

Soluzione 4

A quanto pare

grails -cp ./lib/jsch.jar 

è stata la risposta, non il -classpath o --classpath che inizialmente avevo provato.

Se qualcuno ha una risposta migliore non mancherò di accettarla sulla mia.

Ho provato mettendo il vaso in grails / lib ma diventa caricato dopo il resolver vengono elaborati.

Ho provato a farlo in PreInit.groovy ma senza fortuna ci sia.

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

Altri suggerimenti

Ho avuto lo stesso problema e ottenuto questa risposta dalle Roberts Ian nella lista utenti Grails, che lavora per me:

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()

Passando il caricatore di classe che ha caricato Ivy come il genitore è importante in modo che sia in grado di risolvere le classi Ivy.

Se avete bisogno di caricare più vasi (perché la classe si sta caricando dipende da loro), poi mettere tutti i file nella lista in questo modo:

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()

Un'altra opzione che sembra funzionare è quello di utilizzare @Grab . Qualcosa di simile:

@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

Se il vaso non è in un archivio pubblico, può essere un po 'più complicato.

usi Grails edera per la sua attuazione di gestione delle dipendenze. Tutto quello che dovrebbe essere necessario fare è dichiarare le librerie extra necessari. Hai provato qualcosa di simile:

dependencies {
    ..
    compile 'com.jcraft:jsch:0.1.42'
    ..
}   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top