首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用CDI (焊缝)编写可插拔的应用程序?

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

Stack Overflow用户
提问于 2013-03-15 17:32:23
回答 1查看 941关注 0票数 1

我想编写一个小型SE应用程序来运行操作系统特定的命令。这些命令作为“插件”提供给主应用程序,以便在运行时中添加新的命令实现。这是一个强制性请求:执行新插件不需要重新部署主应用程序。

因此,我开始尝试使用CDI设置一些东西:

代码语言:javascript
复制
// 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中):

代码语言:javascript
复制
@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()调用,可以很好地工作:

代码语言:javascript
复制
@Inject @Any Instance<Pluggable> plugin;

但是,我想知道在运行时中添加类的最佳方法是什么,这样向"plugins“目录中添加新文件的事件就会自动将其注册到ClassLoader Weld容器上。

有什么建议吗?我还没想过的陷阱?我在CDI方面的经验是相当有限的,也许它甚至不是解决这个问题的合适选择。

由于公司的许可政策,免责声明被排除在外。在这方面帮不上忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-16 03:04:05

在我看来,您正在寻找的是CDI1.1所要求的特性,但即使是CDI2.0,它也不太可能出现,请参阅此JIRA。其中甚至讨论了几种备选方案,您可能需要考虑。

简单的答案是-不,CDI本身并不提供这样的功能。尽管如此,假设您能够自己实现动态类加载,在SE环境中,简单地重新启动CDI容器(本质上是用新加载的插件动态地重新配置应用程序)是非常简单的--参见引导CDI

所以你会更改目录。这将触发动态类加载,然后触发焊缝重新启动。动态类加载部分会变得毛茸茸的,所以我会让您搞清楚这一点。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15438680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档