gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:27:47 25 4
gpt4 key购买 nike

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

当使用以下注入(inject)点加载时,加上 select() 调用,效果很好:

@Inject @Any Instance<Pluggable> plugin;

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

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

免责声明 由于公司许可政策,OSGI 被排除在外。在这方面无法提供帮助。

最佳答案

在我看来,您正在寻找的功能是 CDI 1.1 所要求的功能,但即使是 CDI 2.0,它也不太可能出现,请参阅此 JIRA 。那里甚至讨论了您可能想要考虑的几种替代方案。

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

所以你会watch your /plugins directory for changes 。这将依次触发动态类加载,然后重新启动 Weld。动态类加载部分可能会变得很复杂,所以我会让您弄清楚这一点。

希望这有帮助。

关于java - 如何使用 CDI(焊接)编写可插拔应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com