在我的库中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应用程序会自动使用JavaCompiler
,which can't find its dependencies for dynamically compiling编译某些类。我将FooLibrary.jar
添加到Tomcat类路径中的那一刻(例如,在Eclipse内部的Tomcat的启动配置中,或者如果运行Tomcat独立时我假定为startup.sh
或setclasspath.bat
),则autowire将停止工作。 / p>
也就是说,当我的webapp启动时,Spring会创建所有Bar
个实例,然后实例化FooImpl
,但永远不会自动装配 Bar
s的集合进入FooImpl.bars
。 知道为什么吗?
(它是否与从webapp类加载器启动的Spring ContextLoaderListener
有关,但我想知道来自Tomcat类加载器的FooImpl
和Bar
实例?)< / p>
答案 0 :(得分:0)
由于不兼容的类型(例如,在多个类加载器中加载的类),自动装配可能会失败。
由于您已经将JAR放在tomcat的引导类路径中,因此它必须对webapp可见,而不必将JAR放在WEB-INF / lib中。
您可以使依赖范围provided
不让Maven将其放在WEB-INF / lib中。