我有一个基于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
谢谢。
答案 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?