В Граале, как мне указать банки, необходимые для резолюра плюща?

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

  •  10-10-2019
  •  | 
  •  

Вопрос

В проекте 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'
    ..
}   
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top