Spring Tomcat6“No LoadTimeWeaver available”代码配置的webapp上下文出错

时间:2013-06-04 14:29:21

标签: spring web-applications tomcat6 load-time-weaving

我正在开发一个基于Spring 3.2.1的webapp(RestFull服务)来部署在Tomcat 6服务器上。由于Jpa,Transaction和其他自定义依赖项目的功能,我必须启用loadTime编织。为此,我首先在app / META-INF中配置了我的context.xml:

<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>

然后我在我的tomcat / lib中放了 spring-instrument-3.2.1.RELEASE.jar spring-instrument-tomcat-3.2.1.RELEASE.jar 文件夹中。

并将web.xml配置为用户annotationBasedConfiguration

<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>local</param-value>
</context-param>


<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
com.xxx.yyy.spring.SpringConfiguration
com.xxx.yyy.configuration.spring.WebSpringConfiguration
</param-value>
</context-param>

<!--Spring -->

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Webapp使用没有XML的代码配置,所以我创建了一个@Configuration注释类,如:

@Configuration
@Profile("local")
@EnableLoadTimeWeaving
@EnableSpringConfigured
@EnableTransactionManagement(proxyTargetClass = true)
@Import(value = {DataSourceLocal.class,HibernateConfigurationLocal.class})
@ImportResource({"classpath:/database-context.xml"}) // context from imported jar library
@ComponentScan(basePackages = {"com.xxx.yyy","com.xxx.yyy.configuration"})
@EnableJpaRepositories(basePackages = {"com.xxx.yyy.repositories"})
public class SpringConfiguration
{ 
[...]
}

当我尝试启动应用程序时,我收到了错误

ERROR | ContextLoader - Context initialization failed
java.lang.IllegalStateException: No LoadTimeWeaver available

首先,在我看来,LoadTimeWeaving没有正确配置,但经过一天尝试任何可能的解决方法后,我仍然没有找到解决方案。

我能看到的唯一奇怪的是日志行:

Overriding bean definition for bean 'loadTimeWeaver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.context.annotation.LoadTimeWeavingConfiguration; factoryMethodName=loadTimeWeaver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/context/annotation/LoadTimeWeavingConfiguration.class]] with [Generic bean: class [org.springframework.context.weaving.DefaultContextLoadTimeWeaver]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null;

在我看来,2个不同的同名bean(“LoadTimeWeaver”??)是在应用程序上下文中创建的,具有不同的定义,并且这两个bean在某种程度上是冲突的。

weaver是否有可能使用上下文创建:load-time-weaver(存在于从导入的jar加载的上下文文件中)和在我的新上下文中使用@EnableLoadTimeWeaving创建的那个以某种方式发生冲突? 有没有办法只使用最后一个覆盖其中一个?

0 个答案:

没有答案