我想编写一个小的SE应用程序来运行特定于OS的命令。这些命令作为“插件”提供给主应用程序,以便能够在运行时上添加新的命令实现。这是一个强制性的要求:不要求重新部署主应用程序来执行新的插件。如何使用CDI(焊接)编写可插拔应用程序?
于是,我又如何使用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;
但是,我不知道添加在运行时上添加类的最佳方法是什么,以便将新文件添加到“插件”目录的事件会自动将其注册到ClassLoader 和 Weld容器中。
有什么建议吗?我还没有考虑的陷阱?我在CDI方面的经验相当有限,也许它甚至可能不适合这个问题。
免责声明由于公司的许可政策,OSGI已被排除。在这方面无能为力。
这就是我的想法,但它似乎是错的......但我认为没有其他办法。 – javabeats 2013-03-19 12:48:39
@javabeats是的,基于CDI _experts_在JIRA上讨论的内容,我会说是这样。 – rdcrng 2013-03-19 13:01:09