我有一个使用 Google Guice 模块的 webapp,部署到 Tomcat 9。
我想为用户提供动态添加一些暴露一些绑定的模块的可能性,而无需重新打包 webapp 以包含它们。
我使用这个问题中的 ModuleLoader:有人将 ServiceLoader 与 Guice 一起使用吗? 在我的主应用程序中,我定义了一个自定义接口:PluginModule
public interface PluginModule extends Module {
插件模块类如下所示:
@AutoService(PluginModule.class)
public class MyPluginModule extends AbstractModule implements PluginModule {
我想我的插件配置得很好,因为 webapp 也可以独立运行,在这种情况下,我的插件被找到,模块被安装并且包含的绑定可用。
但是,当部署到 Tomcat/webapps 时,我收到此错误:
java.util.ServiceConfigurationError: com.mycompany.PluginModule: Provider com.mycompany.MyPluginModule not a subtype
该插件位于 Tomcat/shared/libs 中(在 catalina.properties 中配置了“shared.loader”)
我认为它与一些类加载器问题有关,也许加载的接口在 webapp 和插件中被认为不一样,所以我尝试将 PluginModule 接口放入我已经放入 shared/libs 的 API jar 中,但是我遇到了同样的问题。
我还尝试将我的插件放入外部文件夹并使用 setenv.sh 脚本将其设置在 CLASSPATH 中,但没有成功。
这看起来像是 OSGi 的一个很好的用例,不幸的是我(目前)无法修改应用程序以使其准备好 OSGi。
我怎么能把一些插件罐子放在某个地方,让 webapp 用 ServiceLoader 轻松加载它们?我可以将它们放在 webapp/WEB-INF/lib 文件夹中并且它可以工作,但是每次重新部署都会删除它们,理想情况下我希望避免重新部署插件。