我想编写一个小型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方面的经验是相当有限的,也许它甚至不是解决这个问题的合适选择。
由于公司的许可政策,免责声明被排除在外。在这方面帮不上忙。
发布于 2013-03-16 03:04:05
在我看来,您正在寻找的是CDI1.1所要求的特性,但即使是CDI2.0,它也不太可能出现,请参阅此JIRA。其中甚至讨论了几种备选方案,您可能需要考虑。
简单的答案是-不,CDI本身并不提供这样的功能。尽管如此,假设您能够自己实现动态类加载,在SE环境中,简单地重新启动CDI容器(本质上是用新加载的插件动态地重新配置应用程序)是非常简单的--参见引导CDI。
所以你会更改目录。这将触发动态类加载,然后触发焊缝重新启动。动态类加载部分会变得毛茸茸的,所以我会让您搞清楚这一点。
希望这能有所帮助。
https://stackoverflow.com/questions/15438680
复制相似问题