En Grails, comment puis-je spécifier des pots nécessaires par un résolveur de lierre?

StackOverflow https://stackoverflow.com/questions/3999057

  •  10-10-2019
  •  | 
  •  

Question

Dans un projet Grails J'ai ajouté un résolveur de lierre personnalisé par la documentation de référence, http://www.grails.org/doc/latest/guide/single.html#12.2%20Plugin%20Repositories .

Cependant, ce résolveur nécessite jsch et et quelques autres pots. Comment puis-je les mettre sur le chemin de classe de construction du projet afin que le lierre va les utiliser?

Ceci est mon 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'
    }   
}
Était-ce utile?

La solution 4

Apparemment

grails -cp ./lib/jsch.jar 

est la réponse, pas le -classpath ou --classpath que j'avais d'abord essayé.

Si quelqu'un a une meilleure réponse que je vais certainement l'accepter sur le mien.

J'ai essayé de placer le pot dans Grails / lib mais il devient chargé après les résolveurs sont traités.

J'ai essayé en PreInit.groovy mais pas de chance non plus.

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

Autres conseils

J'ai eu le même problème et a obtenu cette réponse des Roberts Ian sur la liste des utilisateurs Grails qui fonctionne pour moi:

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

Passer le chargeur de classe chargé Ivy comme le parent est important pour qu'il puisse résoudre les classes Ivy.

Si vous avez besoin de charger plusieurs pots (car la classe que vous êtes le chargement dépend d'eux), puis mettre tous les fichiers dans la liste comme ceci:

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

Une autre option qui semble fonctionner est d'utiliser @Grab. Quelque chose comme:

@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

Si votre pot est pas dans un dépôt public, il peut être un peu plus délicat.

Grails utilisations de lierre à mettre en œuvre de la gestion des dépendances. Tout ce que vous avez besoin de faire est de déclarer les bibliothèques supplémentaires dont vous avez besoin. Avez-vous essayé quelque chose comme ceci:

dependencies {
    ..
    compile 'com.jcraft:jsch:0.1.42'
    ..
}   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top