0

我有一个基于弹簧的 Web 服务。我现在想为它构建一种插件,用 bean 扩展它。我现在在 web.xml 中的内容是:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/classes/*-configuration.xml</param-value>
</context-param>

我的核心应用程序main-configuration.xml声明了它的 bean。我的插件应用程序plugin-configuration.xml声明了额外的 bean。现在,当我部署时,我的构建部署并复制plugin.jar到./WEB-INF/lib/plugin-configuration.xml/WEB-INF/classes/main.war

这一切都很好(虽然我认为可能有更好的解决方案),但是当我开发插件时,我不想在 Eclipse 中有两个项目有依赖关系。我希望将main.jar它包含在一个库中。但是,web.xmlfrommain.jar不会自动发现。我怎样才能做到这一点?豆类注射?某种类型的 Bean 发现?还有什么?

注意:我希望在生产中有多个不同的插件,但是每个插件的开发都将针对纯 main.jar

谢谢你。

4

2 回答 2

1

代替/WEB-INF/classes/*-configuration.xml, tryclasspath:*-configuration.xml 您还可以列出配置文件,每个文件都在一个新行上。

您必须确保 main.jar 最终位于 WEB-INF/lib 中,如果您不使用 maven,您可以在 eclipse 中通过将 webapp 标记为依赖于创建 main.jar 的项目来执行此操作,通过项目属性。

于 2010-03-25T07:39:15.300 回答
1

我认为有一个更简单的方法:

在您的主机应用程序(webapp)中定义类似于以下contextConfigLocation参数的内容:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath*:/META-INF/foo/*-configuration.xml</param-value>
</context-param>

关键部分是classpath*:因为它会扫描整个类路径以查找与以下模式匹配的配置文件。如果您只使用classpath:查找将在找到的第一个文件处停止。如果未正确加注星号,它也不会遍历 JAR。

第二个关键部分是至少有一个非通配基路径供查找工作。这是由于Classloader特征只有在它们包含基本路径时才能可靠地返回所有资源(有关详细信息,请参阅JavadocPathMatchingResourcePatternResolver)。

您现在对插件项目要做的就是将您的plugin-configuration.xmlin /META-INF/foo/、打包为 JAR 并将其放入您的类路径中(如果您使用 Maven 构建,只需添加依赖项)。

在应用程序启动时,Spring 现在还将从您的插件中获取所有配置文件,并从 em 构建 ÀapplicationContext`。

您可能还想查看我在 Spring 的应用程序模块化方面所做的另一篇文章:如何进行多模块弹簧配置?

于 2010-03-26T12:30:16.607 回答