我有一个使用Google Guice模块的webapp,部署到Tomcat 9。
我想为用户提供动态添加一些模块的可能性,这些模块暴露一些绑定而无需重新打包webapp以包含它们。
我使用此问题的ModuleLoader:Has anyone used ServiceLoader together with 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中(" shared.loader"在catalina.properties中配置)
我认为它与某些类加载器问题有关,也许加载的接口在webapp和插件中被认为是不一样的,所以我试图把PluginModule接口放到一个API jar中,我就是这样。我也投入了共享/ libs,但我遇到了同样的问题。
我还尝试将我的插件放入外部文件夹并使用setenv.sh脚本在CLASSPATH中设置它,但没有成功。
这看起来像OSGi的一个很好的用例,遗憾的是我不能(现在)修改应用程序以使OSGi准备就绪。
我怎么能在某个地方删除一些插件罐,并使用ServiceLoader通过webapp轻松加载它们?我可以将它们放在webapp / WEB-INF / lib文件夹中并且它可以工作,但是每次重新部署都会删除它们,我希望避免重新部署插件。