[英]How to write a pluggable application using CDI (weld)?
我想编写一个小的SE应用程序来运行特定于操作系统的命令。 这些命令作为“插件”提供给主应用程序,以便能够在运行时添加新的命令实现。 这是一个强制性的请求:不需要重新部署主应用程序即可执行新的插件。
因此,我尝试使用CDI进行设置:
// On a common dependency
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Plugin {
String value();
}
public interface Pluggable {
void execute(PluginContext context);
}
插件实现将是这样的(在单独的jar中):
@Plugin("greeting")
public class GreetingPlugin implements Pluggable {
public void execute(PluginContext context) {
String greet = context.get("hello.world");
System.out.println(String.format("Hello, %s", greet));
}
}
当使用以下注入点以及select()调用加载时,效果很好。
@Inject @Any Instance<Pluggable> plugin;
但是,我想知道在运行时添加能够添加类的能力的最佳方法是什么,以便将新文件添加到“ plugins”目录的事件自动在ClassLoader 和 Weld容器上注册它。
有什么建议么? 我还没有考虑过的陷阱? 我在CDI方面的经验非常有限,也许它甚至可能不是解决此问题的合适选择。
免责声明由于公司的许可政策,排除了OSGI。 在这方面无能为力。
在我看来,您正在寻找的功能已被CDI 1.1要求,但即使在CDI 2.0中也不太可能实现,请参阅JIRA 。 您甚至可能要考虑其中讨论的几种替代方法。
简单的答案是-不,CDI本身不提供这种功能。 就是说,假设您可以管理自己实现动态类的加载,那么在SE环境中,简单地重新启动CDI容器(实质上是使用新加载的插件动态地重新配置您的应用程序)是微不足道的-请参阅Bootstrapping CDI 。
因此,您将在/plugins
目录中查看更改 。 这将依次触发动态类加载,然后重新启动焊接。 动态类加载部分可能会变得很毛茸茸,所以我让您知道这一点。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.