我正在开发一个基于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创建的那个以某种方式发生冲突? 有没有办法只使用最后一个覆盖其中一个?