Как в Grails указать банки, необходимые для распознавателя плюща? - PullRequest
1 голос
/ 22 октября 2010

В проекте Grails я добавил пользовательский распознаватель плюща для справочных документов, http://www.grails.org/doc/latest/guide/single.html#12.2%20Plugin%20Repositories.

Однако для этого преобразователя требуются jsch и некоторые другие jar-файлы.Как я могу поместить их в путь к классам сборки проекта, чтобы ivy использовал их?

Это мой 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'
    }   
}

Ответы [ 4 ]

0 голосов
/ 16 июня 2011

Другой вариант, который, кажется, работает, это использовать @ Grab . Что-то вроде:

@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

Если ваша банка отсутствует в общедоступном хранилище, это может быть немного сложнее.

0 голосов
/ 23 октября 2010

Очевидно, что

grails -cp ./lib/jsch.jar 

был ответом, а не -classpath или --classpath, который я изначально пробовал.

Если у кого-то есть лучший ответ, я обязательно приму его вместо моего.

Я пытался поместить jar в grails / lib, но он загружается после обработки преобразователей.

Я пробовал это в PreInit.groovy, но там тоже не повезло.

grails.compiler.dependencies = { fileset(file:'${basedir}/lib/jsch.jar') } 
0 голосов
/ 14 июня 2011

У меня была та же проблема, и я получил ответ от Иана Робертса из списка пользователей Grails, который работает для меня:

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

Передача загрузчика классов, который загрузил Ivy в качестве родителя, важна, так что онможет разрешать классы плюща.

Если вам нужно загрузить несколько jar-файлов (поскольку класс, который вы загружаете, зависит от них), поместите все файлы в список следующим образом:

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 голосов
/ 22 октября 2010

Grails использует ivy для реализации управления зависимостями. Все, что вам нужно сделать, это объявить дополнительные библиотеки, которые вам нужны. Вы пробовали что-то вроде этого:

dependencies {
    ..
    compile 'com.jcraft:jsch:0.1.42'
    ..
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...