2012-03-13 72 views
0

我正在运行一个grails脚本来从grails应用程序加载一个bean,但是,似乎我有一个依赖关系问题。这是我的代码:从Grails脚本加载bean

import grails.spring.BeanBuilder 
import org.springframework.context.ApplicationContext 

target(main: "Script to load location information into Solr") { 

println "Hello script" 
def bb = new BeanBuilder() 
ApplicationContext appContext = bb.createApplicationContext() 
def service = appContext.getBean("solrjService") 
} 

setDefaultTarget(main) 

当我执行该脚本,我得到以下堆栈跟踪:

main: 
Hello script 
java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:108) 
at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:130) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
    Caused by: java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory 
at org.slf4j.LoggerFactory.staticInitialize(LoggerFactory.java:83) 
at org.slf4j.LoggerFactory.<clinit>(LoggerFactory.java:73) 
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155) 
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:131) 
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:272) 
at grails.spring.BeanBuilder.<clinit>(BeanBuilder.java:84) 

任何想法?

感谢您的时间

+0

我以为它崩溃的方式告诉你,有没有'solrjService'豆在新的,空的应用程序上下文。 – 2012-03-13 18:52:34

+0

我需要从这个groovy脚本加载solrjService,所以,我应该怎么做?如果我评论ApplicationContext appContext = bb.createApplicationContext() 和def service = appContext.getBean(“solrjService”),它仍然崩溃。我如何看到grails应用程序中的依赖冲突? (可能我必须在Buildconfig.groovy中排除一些库),这要感谢Burt – 2012-03-13 19:28:27

回答

2

如果你读调用堆栈,这显然与SLF4J问题。

http://slf4j.org/faq.html#IllegalAccessError

看起来你可混合SLF4J罐子的版本,并获得了冲突。

但是,当然,Burt是正确的 - 一旦你过去了,你会发现你已经初始化BeanBuilder的ApplicationContext而没有bean。

+0

这是找到这个罐子的最好方法吗?我知道他们在.ivy /缓存目录(我可以看看那里手动),但我想知道是否有一种自动的方式来做到这一点(某些工具...)谢谢 – 2012-03-13 21:26:46

1

我必须包括目标_GrailsBootstrap能够载入我的豆http://grails.org/doc/latest/guide/commandLine.html#creatingGantScripts

includeTargets << grailsScript("_GrailsBootstrap") 

target ('default': "Load Location Information to Solr Server") { 

depends(configureProxy, packageApp, classpath, loadApp, configureApp) 
def service = appCtx.getBean('solrjService') 
println service.getLocationSuggestion("Barcelona") 

} 

我运行脚本,他的方式(这就是为什么我有一个类路径问题)现在

grails run-script scripts/Myscript.groovy 

然后,我这样运行

grails Myscript.groovy 

我没有任何classpath probl EMS:d

感谢您的帮助