2010-10-22 29 views
1

Dans un projet de grails j'ai ajouté un résolveur de lierre personnalisé par les documents 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 d'autres bocaux. Comment puis-je les mettre sur le classpath de construction du projet pour que Ivy les utilise?Dans Grails, comment spécifier les bocaux requis par un résolveur ivy?

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' 
    } 
} 

Répondre

-2

Apparemment

grails -cp ./lib/jsch.jar 

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

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

J'ai essayé de placer le pot dans grails/lib mais il est chargé après le traitement des résolveurs. J'ai essayé cela dans PreInit.groovy mais pas de chance là non plus.

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

Grails utilise le lierre pour mettre en œuvre sa gestion dépendance. Tout ce que vous devez 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' 
    .. 
} 
+0

J'ai essayé de construire 'com.jcraft: jsch: 0.1.42' Malheureusement ce n'est pas une dépendance du projet mais du résolveur. Donc, j'obtiens l'erreur avant que les dépendances ne soient traitées. – gabe

0

J'ai eu le même problème et a obtenu cette réponse du Ian Roberts 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 peut résoudre les classes Ivy.

Si vous avez besoin de charger plusieurs pots (parce que la classe que vous chargez 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() 
+0

C'est assez intelligent. Malheureusement, je reçois encore java.lang.ClassNotFoundException: com.jcraft.jsch.JSchException avec def myCL = new URLClassLoader ([nouveau fichier ( "$ {basedir} /lib/jsch-0.1.31.jar" ) .toURI(). toURL()] en tant qu'URL [], org.apache.ivy.plugins.repository.AbstractRepository.classLoader) résolveur myCL.loadClass ('org.apache.ivy.plugins.resolver.SshResolver') .newInstance() Oh bien. Bonne chose que je suis passé à un référentiel maven régulière. – gabe

+0

@gabe, vous devez ajouter tous les jars requis à la liste. Je vais le mettre à jour pour plusieurs bocaux. – noah

0

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.