弹簧罐自动装载

Nag*_*gyI 8 java plugins spring classloader

我的项目使用基于插件jar中定义的多个应用程序上下文的简单插件机制.但是为了实现这一点,我必须在类路径中包含所有插件jar.如果Spring可以自动加载jar并且包含它自己的组件会很好,例如它们放在我项目的'plugins'子目录中.

这有什么解决方案吗?


我走得更远,试图用Jar Class Loader来解决这个问题.

因为我手动实例化Spring应用程序上下文,所以我可以执行以下操作:

GenericApplicationContext ctx = new GenericApplicationContext();

// Load context definitions from plugin jars
JarClassLoader jcl = new JarClassLoader();
jcl.add("plugins/");

XmlBeanDefinitionReader classPathBeansReader = new XmlBeanDefinitionReader(ctx);
classPathBeansReader.setBeanClassLoader(jcl);
classPathBeansReader.setResourceLoader(new PathMatchingResourcePatternResolver(jcl));
classPathBeansReader.loadBeanDefinitions("classpath*:META-INF/my-plugins-*.xml");
Run Code Online (Sandbox Code Playgroud)

但这不起作用.从Spring的日志中我可以看到它没有读取插件jar中的XML定义.如果我用底部块替换

XmlBeanDefinitionReader classPathBeansReader = new XmlBeanDefinitionReader(ctx);
classPathBeansReader.setBeanClassLoader(jcl);
classPathBeansReader.loadBeanDefinitions(new ClassPathResource("META-INF/my-plugins-somemodule.xml",jcl));
Run Code Online (Sandbox Code Playgroud)

它从jar中查找并加载XML定义文件和bean.然而,这种方式我硬连接一个插件的XML资源名称,我不想.如何使模式匹配与JCL一起使用?

Gly*_*ton 4

您可能会考虑使用OSGi作为您的插件加载机制。

Eclipse Virgo开源项目提供了一个适合您的项目的 OSGi 运行时环境,因为它内置了 Spring。Virgo 提供基于 Tomcat 和 Jetty 的服务器以及一个独立的内核,可以单独使用或构建其他类型的服务器。有关功能优点,请参阅 Virgo 网站。

OSGi 的设计点与您在 Java 中可能习惯的设计点完全不同。与线性类路径不同,它为您提供插件之间的受控隔离(称为捆绑)。捆绑包在依赖关系图中连接在一起,并支持版本控制和动态生命周期操作。

捆绑包使用其他捆绑包的功能的首选方式是通过 OSGi 服务注册表。Spring DM项目允许将普通 Spring bean 发布到服务注册表并从服务注册表中进行查找。Spring DM 也内置于 Virgo 中。Spring DM 已作为Gemini Blueprint项目捐赠给 Eclipse。

要使用 Virgo,您需要向 META-INF/spring 目录中的每个插件添加一些 Spring DM 配置。此配置是一个普通的 XML Spring 配置文件,可以引用其他 Spring 文件中的 bean 并将这些 bean 发布到服务注册表中,或者可以为在服务注册表中查找的服务提供 bean,然后可以引用并注入这些 bean到其他 Spring 文件中的 beans 中。

然后,您可以使用任何受支持的机制将插件部署到 Virgo 中。您可以简单地将它们按依赖顺序放入拾取目录中。或者您可以使用 Web 管理控制台或 shell 控制台进行部署。

或者,这似乎很适合您的要求,您可以将为 Virgo 存储库中的其他插件提供包的插件放置在存储库/usr 中,然后通过pickup 部署依赖于存储库插件的插件(传递)目录或 Web 管理控制台。Virgo 将在部署依赖插件时自动从存储库部署依赖项。

您还可以将插件分组到一个存档中(称为PAR ),或者将它们存储在 Virgo 存储库中,然后在 XML 文件(称为 plan )中引用它们。然后,您将按照上述方式部署 PAR 或计划。您甚至可以将一些依赖项放入 Virgo 存储库中并减少 PAR 或计划仅包含依赖插件。

如果您想了解有关 Virgo 的更多信息,请在Virgo 社区论坛上提问。