In Grails, come faccio a specificare vasi necessari da un resolver edera?
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'
}
}
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'
..
}