繁体   English   中英

如何使用CDI(焊接)编写可插拔应用程序?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM