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'
    }   
}
War es hilfreich?

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'
    ..
}   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top