0

在我的库中, FooLibrary.jarSpring 实例化com.example.FooImpl了具有属性的类bars。我有很多Bar实例也由 Spring 实例化。一组条形图自动连接成FooImpl这样:

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

在独立应用程序中,Spring 实例化Bar实例,实例化FooImpl实例,然后FooImpl.barsBars 集合自动装配。有用。

现在我在 Tomcat 内的 webapp 中运行相同的 Spring 配置。FooLibrary.jar在里面WEB-INF/lib,一切都按照上面的描述继续工作。

问题是 Web 应用程序使用 自动编译 somes 类,除非我将该库放在启动 Tomcat 路径上,否则JavaCompiler无法找到其动态编译的依赖项。我添加FooLibrary.jar到 Tomcat 类路径的那一刻(例如,在 Eclipse 内的 Tomcat 启动配置中,或者我假设startup.sh或者setclasspath.bat如果单独运行 Tomcat),自动装配停止工作。

也就是说,当我的 webapp 启动时,Spring 会创建所有Bar实例,然后实例化FooImpl,但不会Bar将s集合自动连接到FooImpl.bars. 知道为什么吗?

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

4

1 回答 1

0

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

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

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

于 2013-06-13T18:25:21.563 回答