扩展基于弹簧的应用程序

时间:2010-03-24 21:42:07

标签: java web-services spring spring-ws

我有一个基于Spring的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.xml中的main.jar不会自动发现。我怎样才能做到这一点?豆注射? Bean的某种发现?还有别的吗?

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

谢谢。

2 个答案:

答案 0 :(得分:1)

而不是/WEB-INF/classes/*-configuration.xml,请尝试classpath:*-configuration.xml 您还可以在新行中列出配置文件。

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

答案 1 :(得分: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特征只有在包含基本路径的情况下才能可靠地返回所有资源(有关详细信息,请参阅PathMatchingResourcePatternResolver上的Javadoc)。

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

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

您还可以查看我在Spring上使用应用程序模块化做的另一篇文章:How do you make a multi-module spring configuration?