1

我想编写一个小型 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;

但是,我想知道添加在运行时添加类的能力的最佳方法是什么,以便将新文件添加到“插件”目录的事件自动将其注册到 ClassLoaderWeld 容器上。

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

免责声明由于公司许可政策,OSGI 被排除在外。在这方面无能为力。

4

1 回答 1

2

在我看来,您正在寻找的是 CDI 1.1 所要求的功能,但即使对于 CDI 2.0,它也不太可能进入,请参阅此JIRA。您可能需要考虑其中讨论的几种替代方案。

简单的答案是 - 不,CDI 本身不提供此类功能。也就是说,假设您可以自己实现动态类加载,在 SE 环境中,只需重新启动 CDI 容器就可以轻松地使用新加载的插件动态重新配置您的应用程序 - 请参阅Bootstrapping CDI

所以你会观察你的/plugins目录是否有变化。这反过来会触发动态类加载,然后重新启动焊接。动态类加载部分可能会变得很复杂,所以我会让你弄清楚这一点。

希望这可以帮助。

于 2013-03-16T03:04:05.667 回答