【问题标题】:Loading beans from Grails Script从 Grails 脚本加载 bean
【发布时间】:2012-03-13 17:30:59
【问题描述】:

我正在运行一个 grails 脚本来从 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)

有什么想法吗??

感谢您的宝贵时间

【问题讨论】:

  • 我假设它在告诉您在新的空应用程序上下文中没有 solrjService bean 的途中崩溃了。
  • 我需要从这个 groovy 脚本中加载 solrjService,那么,我应该怎么做呢?如果我评论 ApplicationContext appContext = bb.createApplicationContext() 和 def service = appContext.getBean("solrjService") 它仍然崩溃。如何查看 grails 应用程序中的依赖项冲突? (可能我必须在 Buildconfig.groovy 中排除一些库)谢谢 Burt

标签: grails dependencies


【解决方案1】:

如果您阅读了调用堆栈,那显然是 SLF4J 的问题。

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

看起来您可能正在混合 SLF4J jar 的版本,并发生冲突。

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

【讨论】:

  • 找到这个罐子的最好方法是什么?我知道它们在 .ivy/cache 目录中(我可以手动查看),但我想知道是否有一种自动方法可以做到这一点(一些工具......)谢谢
【解决方案2】:

我必须包含目标 _GrailsBootstrap 才能加载我的 bean 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

我没有任何类路径问题:D

感谢您的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2012-12-31
    相关资源
    最近更新 更多