我想編寫一個小的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