在grails项目中,我根据参考文档http://www.grails.org/doc/latest/guide/single.html#12.2%20Plugin%20Repositories添加了自定义常春藤解析器。
但是,这个解析器需要jsch和其他一些罐子。如何将它们放在项目的构建类路径中,以便常春藤使用它们?
这是我的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'
}
}
答案 0 :(得分:0)
我遇到了同样的问题,并且从Grails用户列表中的Ian Roberts得到了这个答案,这对我有用:
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的类加载器作为父级传递是很重要的,这样它就可以解析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()
答案 1 :(得分:0)
似乎有效的另一个选择是使用@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
如果你的jar不在公共存储库中,那可能会有点棘手。
答案 2 :(得分:-1)
Grails使用常春藤来实现它的依赖管理。您需要做的就是声明您需要的额外库。你尝试过这样的事情:
dependencies {
..
compile 'com.jcraft:jsch:0.1.42'
..
}
答案 3 :(得分:-2)
显然
grails -cp ./lib/jsch.jar
是答案,而不是我最初尝试过的-classpath或--classpath。
如果有人有更好的答案,我肯定会接受它。
我尝试将jar放在grails / lib中,但是在处理完解析器后会加载它。
我在PreInit.groovy尝试了这个,但也没有运气。
grails.compiler.dependencies = { fileset(file:'${basedir}/lib/jsch.jar') }