2013-03-15 44 views
1

我想編寫一個小的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已被排除。在這方面無能爲力。

回答

2

在我看來,你正在尋找的是CDI 1.1所要求的功能,但它甚至不可能在CDI 2.0中發揮作用,請參閱此JIRA。在那裏你甚至可以考慮幾個備選方案。

簡單的答案是 - 不,CDI本身不提供這樣的功能。也就是說,假設您可以設法自己實現動態類加載,那麼在SE環境中,只需重新啓動CDI容器就可以實現動態重新配置您的應用程序,這一點很簡單 - 請參閱Bootstrapping CDI

所以你會watch your /plugins directory for changes。這反過來會觸發動態類加載,然後重新啓動焊接。動態類加載部分會變得毛茸茸的,所以我會讓你弄清楚。

希望這會有所幫助。

+0

這就是我的想法,但它似乎是錯的......但我認爲沒有其他辦法。 – javabeats 2013-03-19 12:48:39

+0

@javabeats是的,基於CDI _experts_在JIRA上討論的內容,我會說是這樣。 – rdcrng 2013-03-19 13:01:09

相關問題