Spring autowire停止为Tomcat类路径上的类工作

时间:2013-06-10 17:47:54

标签: spring tomcat classpath autowired inject

在我的库中FooLibrary.jar Spring实例化具有属性com.example.FooImpl的类bars。我有许多Bar实例也被Spring实例化。一组条形图自动装入FooImpl,如下所示:

@Component
public class FooImpl {
  @Inject
  private Set<Bar> bars;

在独立应用程序中,Spring实例化Bar个实例,实例化FooImpl个实例,然后使用FooImpl.bars的集合自动装配Bar。它有效。

现在我在Tomcat内的webapp中运行相同的Spring配置。 FooLibrary.jar位于WEB-INF/lib内,一切都继续如上所述。

问题是,除非我将该库放在启动Tomcat路径上,否则Web应用程序会自动使用JavaCompilerwhich can't find its dependencies for dynamically compiling编译某些类。我将FooLibrary.jar添加到Tomcat类路径中的那一刻(例如,在Eclipse内部的Tomcat的启动配置中,或者如果运行Tomcat独立时我假定为startup.shsetclasspath.bat),则autowire将停止工作。 / p>

也就是说,当我的webapp启动时,Spring会创建所有Bar个实例,然后实例化FooImpl,但永远不会自动装配 Bar s的集合进入FooImpl.bars知道为什么吗?

(它是否与从webapp类加载器启动的Spring ContextLoaderListener有关,但我想知道来自Tomcat类加载器的FooImplBar实例?)< / p>

1 个答案:

答案 0 :(得分:0)

由于不兼容的类型(例如,在多个类加载器中加载的类),自动装配可能会失败。

由于您已经将JAR放在tomcat的引导类路径中,因此它必须对webapp可见,而不必将JAR放在WEB-INF / lib中。

您可以使依赖范围provided不让Maven将其放在WEB-INF / lib中。