2013-12-13 99 views
1

我想使用我的applicationContext.xml初始化一個bean,但它初始化可能是因爲正在初始化的類擴展了一個坐在一個jar中的抽象類。當初始化擴展類內部的jar的上下文初始化失敗

所以我的主要項目的ApplicationContext中,我有以下幾點:

<bean id="TestMessageListener" class="za.co.mycee.core.util.Test" /> 

我Test.java情況如下:

package za.co.mycee.core.util; 

import org.springframework.amqp.core.AmqpTemplate; 
import org.springframework.amqp.core.Message; 
import org.springframework.beans.factory.annotation.Autowired; 

import za.co.mycee.messaging.model.TestRequest; 
import za.co.mycee.messaging.model.TestResponse; 
import za.co.mycee.messaging.service.TestService; 

import com.rabbitmq.client.Channel; 

public class Test extends TestService { 

    @Autowired 
    private AmqpTemplate template; 

    @Override 
    protected String getQueue() { 
     return "test"; 
    } 

    @Override 
    protected String getExchange() { 
     return ""; 
    } 

    @Override 
    protected Class<TestRequest> getRequestType() { 
     return TestRequest.class; 
    } 

    @Override 
    protected Class<TestResponse> getResponseType() { 
     return TestResponse.class; 
    } 

    @Override 
    protected AmqpTemplate getTemplate() { 
     return this.template; 
    } 

    @Override 
    public void onMessage(Message message, Channel channel) throws Exception { 

     System.out.println(" >> " + new String(message.getBody())); 

    } 

} 

和完整例外做MVN之後,我的tomcat:運行

2013-12-13 15:45:46,031 [main] ERROR org.springframework.web.context.ContextLoader - Context initialization failed 
org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [za.co.mycee.core.util.Test] for bean with name 'TestMessageListener' defined in file [C:\Code\SpringSource\sts-4.3.1.RELEASE\sts-3.4.0.RELEASE\mycee\mycee-core\target\classes\META-INF\spring\applicationContext.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: za/co/mycee/messaging/service/TestService 
     at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1266) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:581) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1332) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:898) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:588) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135) 
     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630) 
     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
     at org.apache.catalina.core.StandardHost.start(StandardHost.java:785) 
     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445) 
     at org.apache.catalina.startup.Embedded.start(Embedded.java:825) 
     at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558) 
     at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
Caused by: java.lang.NoClassDefFoundError: za/co/mycee/messaging/service/TestService 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1141) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1612) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491) 
     at org.springframework.util.ClassUtils.forName(ClassUtils.java:258) 
     at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:415) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1284) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1255) 
     ... 39 more 
Caused by: java.lang.ClassNotFoundException: za.co.mycee.messaging.service.TestService 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491) 
     ... 55 more 
Dec 13, 2013 3:45:46 PM org.apache.catalina.core.StandardContext listenerStart 
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [za.co.mycee.core.util.Test] for bean with name 'TestMessageListener' defined in file [C:\Code\SpringSource\sts-4.3.1.RELEASE\sts-3.4.0.RELEASE\mycee\mycee-core\target\classes\META-INF\spring\applicationContext.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: za/co/mycee/messaging/service/TestService 
     at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1266) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:581) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1332) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:898) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:588) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135) 
     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630) 
     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
     at org.apache.catalina.core.StandardHost.start(StandardHost.java:785) 
     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445) 
     at org.apache.catalina.startup.Embedded.start(Embedded.java:825) 
     at org.codehaus.mojo.tomcat.AbstractRunMojo.startContainer(AbstractRunMojo.java:558) 
     at org.codehaus.mojo.tomcat.AbstractRunMojo.execute(AbstractRunMojo.java:255) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
Caused by: java.lang.NoClassDefFoundError: za/co/mycee/messaging/service/TestService 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1141) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1612) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491) 
     at org.springframework.util.ClassUtils.forName(ClassUtils.java:258) 
     at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:415) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1284) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1255) 
     ... 39 more 
Caused by: java.lang.ClassNotFoundException: za.co.mycee.messaging.service.TestService 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491) 
     ... 55 more 

Dec 13, 2013 3:45:46 PM org.apache.catalina.core.StandardContext start 
SEVERE: Error listenerStart 
Dec 13, 2013 3:45:46 PM org.apache.catalina.core.StandardContext start 
SEVERE: Context [/mycee-core] startup failed due to previous errors 
Dec 13, 2013 3:45:46 PM org.apache.catalina.core.ApplicationContext log 
INFO: Closing Spring root WebApplicationContext 

顯然,如果我刪除擴展TestService並刪除所有@Override,然後運行,但是我可以重新使用TestService中的代碼。 如何讓它知道坐在jar中的TestService並擺脫錯誤?

更新:正如弗雷德裏克已經理所當然地指出,mycee-messaging.jar是不是在我的類路徑,當我建立一個war文件,並期待在WEB-INF/lib下,有沒有mycee-messaging.jar。

所以在我的pom.xml中,我有:

<dependency> 
    <groupId>za.co.mycee</groupId> 
    <artifactId>mycee-messaging</artifactId> 
    <version>${mycee.messaging}</version> 
    <scope>provided</scope> 
</dependency>  

當我做MVN日食:日食,並刷新mycee核心,該項目mycee的消息是根據項目和日食上市似乎要被罰款與它,但它不列在庫下。

檢查.m2/repository/za/co/mycee/mycee-messaging/1.0.1,我可以看到mycee-messaging-1.0.1.jar以及mycee-messaging-1.0.1.pom,so mvn clean install正確地完成了它的工作。

我是否需要在我的pom.xml中添加其他內容以便maven將該jar包含在war文件中?

解決方案:刪除範圍標籤

一些很好的閱讀材料,理解爲什麼規定的範圍正在做它在做什麼: http://docs.codehaus.org/display/MAVENUSER/Dependency+Scopes

+1

你確定jar是在類路徑中嗎?你在WEB-INF/lib中找到它嗎?因爲它似乎是測試類,如果你正在使用不是那個jar有範圍測試? –

+0

嗨弗雷德裏克,測試類不是單元測試的一部分,我應該稱之爲Test.java以外的東西。 我剛剛構建了一個war文件,並且我沒有在WEB-INF/lib中看到mycee-messaging.jar,所以現在我想它變成了一個maven問題,而不是Spring問題。 –

+1

好的問題解決了然後:-) –

回答

2
<scope>provided</scope> 

意味着您希望提供的依賴因爲在這種情況下你的tomcat容器,所以maven在你的戰爭中不會爲你捆綁它。從行家文檔

更多信息:提供

範圍很像編譯,而是指你所期望的JDK 或容器,以提供在運行時的依賴。例如,當 構建Java企業版的Web應用程序時,您將 將Servlet API和相關Java EE API的依賴性設置爲 ,因爲Web容器提供了這些類。此 作用域僅在編譯和測試類路徑中可用,並且 不可傳遞。