В Граале, как мне указать банки, необходимые для резолюра плюща?
Вопрос
В проекте Grails я добавил пользовательский резолювер Айви в соответствии с эталонными документами, http://www.grails.org/doc/latest/guide/single.html#12.2%20plugin%20repositories .
Тем не менее, этот резолювер требует JSCH и некоторых других банок. Как я могу поместить их в группу по сборке проекта, чтобы Айви использовала их?
Это мой сборка.
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
По всей видимости
grails -cp ./lib/jsch.jar
Был ли ответ, а не -classpath или - -classpath, который я изначально пробовал.
Если у кого -то есть лучший ответ, я обязательно приму это над моим.
Я попытался поместить банку в Грааль/Либ, но она загружается после обработки резоклеров.
Я попробовал это в Preinit.groovy, но там тоже не повезло.
grails.compiler.dependencies = { fileset(file:'${basedir}/lib/jsch.jar') }
Другие советы
У меня была та же проблема, и я получил этот ответ от Яна Робертса в списке пользователей 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()
Передача загрузчика класса, который загружал плющ в качестве родителя, важно, чтобы он мог разрешить классы плюща.
Если вам нужно загрузить несколько банок (потому что класс, который вы загружаете, зависит от них), то поместите все файлы в список, как так:
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()
Другой вариант, который, кажется, работает, - это использовать @Схватить. Анкет Что-то типа:
@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
Если ваша банка не в общественном хранилище, это может быть немного сложнее.
Grails использует Айви для реализации управления зависимостями. Все, что вам нужно сделать, это объявить дополнительные библиотеки, которые вам нужны. Вы пробовали что -то вроде этого:
dependencies {
..
compile 'com.jcraft:jsch:0.1.42'
..
}