In Grails, wie kann ich festlegen, Gläser von einem mit Efeu Resolver benötigt?
Frage
In einem Grails Projekt, das ich eine benutzerdefinierte Efeu Resolver pro Referenz docs hinzugefügt haben, http://www.grails.org/doc/latest/guide/single.html#12.2%20Plugin%20Repositories .
Dies erfordert jedoch Resolver jsch und und einige andere Gläser. Wie kann ich auf dem Build-Classpath Projekt so lege sie, dass Efeu davon benutzen?
Das ist mein 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'
}
}
Lösung 4
Offenbar
grails -cp ./lib/jsch.jar
war die Antwort, nicht die -classpath oder --classpath, dass ich zunächst versucht hatte.
Wenn jemand eine bessere Antwort hat werde ich es auf jeden Fall akzeptieren über meine.
Ich habe versucht, das Glas in Grails / lib platzieren, aber es wird geladen, nachdem die Resolver verarbeitet werden.
Ich habe versucht, dies in PreInit.groovy aber kein Glück da.
grails.compiler.dependencies = { fileset(file:'${basedir}/lib/jsch.jar') }
Andere Tipps
Ich hatte das gleiche Problem und bekam diese Antwort von dem Ian Robert auf der Grails-Benutzerliste, die für mich funktioniert:
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()
, um den Klassenlader Passing, die Ivy als Mutter geladen ist wichtig, damit es Ivy Klassen auflösen kann.
Wenn Sie mehrere Gläser laden müssen (weil die Klasse, die Sie Laden von ihnen abhängt), dann alle legen die Dateien in der Liste wie folgt:
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()
Eine weitere Möglichkeit, die Arbeit scheint benutzen @Grab . So etwas wie:
@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
Wenn Ihr Glas nicht in einem öffentlichen Repository ist, kann es ein wenig schwieriger sein.
Grails Anwendungen Efeu es das Abhängigkeitsmanagement zu implementieren. Alles, was Sie sollen tun müssen, um die zusätzliche Bibliotheken erklären Sie benötigen. Haben Sie so etwas wie dies versucht:
dependencies {
..
compile 'com.jcraft:jsch:0.1.42'
..
}