2013-03-15 41 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

相关问题