2010-10-22 65 views
1

在grails項目中,我爲每個參考文檔http://www.grails.org/doc/latest/guide/single.html#12.2%20Plugin%20Repositories添加了一個定製常春藤解析器。在Grails中,我如何指定常春藤解析器所需的罐子?

但是,這個解析器需要jsch和其他一些jar。我如何將它們放在項目的構建類路徑中,以便常青藤使用它們?

這是我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' 
    } 
} 

回答

-2

顯然

grails -cp ./lib/jsch.jar 

就是答案,而不是我最初嘗試-classpath或--classpath。

如果有人有更好的答案我肯定會接受它。

我試着將jar放在grails/lib中,但是在處理解析器之後它會被加載。

我在PreInit.groovy中試過這個,但沒有運氣。

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

Grails使用常青藤來實現它的依賴管理。所有你需要做的是聲明你需要的額外的庫。您是否嘗試過這樣的事情:

dependencies { 
    .. 
    compile 'com.jcraft:jsch:0.1.42' 
    .. 
} 
+0

我試過編譯'com.jcraft:jsch:0.1.42' 不幸的是,它不是項目的依賴項,而是解析器。所以我在處理依賴關係之前得到錯誤。 – gabe 2010-10-22 19:30:12

0

我有同樣的問題,並得到了來自伊恩·羅伯茨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() 
+0

這很聰明。不幸的是我仍然得到拋出java.lang.ClassNotFoundException:com.jcraft.jsch.JSchException 與 高清myCL =新的URLClassLoader([新文件( 「$ {BASEDIR} /lib/jsch-0.1.31.jar」 ).toURI()。toURL()]作爲URL [], org.apache.ivy.plugins.repository.AbstractRepository.classLoader) resolver myCL.loadClass('org.apache.ivy.plugins.resolver.SshResolver') .newInstance() 噢。好東西,我切換到常規的Maven倉庫。 – gabe 2011-06-14 22:00:05

+0

@gabe,你需要將所有需要的罐子添加到列表中。我會更新它的多個罐子。 – noah 2011-06-15 13:41:44

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不在公共存儲庫中,可能會有點棘手。