1

我有一个大型 Java Web 应用程序,我在 tomcat 中部署它。这个应用程序有多个war文件和jar文件。当我将它们部署到 tomcat 时,部署其中一个 war 文件失败,并出现以下错误:

Error creating bean with name 'toolWicketApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'org.sakaiproject.scorm.service.api.ScormResourceService' while setting bean property 'resourceService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No bean named 'org.sakaiproject.scorm.service.api.ScormResourceService' is defined

但是,在我的其他 jar 中,我确实有一个使用该名称定义的 bean:

<bean id="org.sakaiproject.scorm.service.api.ScormResourceService"
    class="org.sakaiproject.scorm.service.chh.impl.CHHResourceService">

    <!-- Sakai API Service -->
    <lookup-method name="configurationService" bean="org.sakaiproject.component.api.ServerConfigurationService" />
    <lookup-method name="contentService" bean="org.sakaiproject.content.api.ContentHostingService" /> 
    <lookup-method name="toolManager" bean="org.sakaiproject.tool.api.ToolManager" />

    <lookup-method name="scormCHH" bean="org.sakaiproject.scorm.content.api.ScormCHH" />
</bean>

我目前的理论是这是加载顺序问题。war文件首先加载,需要一个在jar文件中定义的bean。

我知道 tomcat 在加载 jars 和 war 文件时使用不确定的顺序(请参阅http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.htmlIs there a way to force a deployment order in tomcat6?以及重启tomcat时如何控制webapp部署顺序

但是,我想知道人们如何处理这种相互依赖的罐子和战争的情况。他们是否将所有内容都放在一个单一的 jar/war 文件中?如果 tomcat/spring 正在寻找尚未加载的东西,它不应该等到它加载丢失的组件而不是抛出错误吗?

我确实看到了一个名为“depends-on”的弹簧配置选项。我需要将我的配置更改为:

<bean id="toolWicketApplication" class="org.sakaiproject.scorm.ui.player.ScormTool" 
      depends-on="org.sakaiproject.scorm.service.api.ScormResourceService">
        <property name="resourceService"><ref bean="org.sakaiproject.scorm.service.api.ScormResourceService"/></property>
    </bean>

或者是否有人对还有什么可以解决这个问题有任何其他猜测?

谢谢。

4

0 回答 0