我想要一个模块化应用程序,它在运行时注册JAR模块。为此,我正在使用Netbeans Lookup API。
问题在于,我无法直接在库文件夹中复制某些JAR文件,因为正在运行的实例无法识别它。
在模块中,我已将META-INF.services
配置为接口的包名称和模块包名称。
以下是我的代码示例:
while(true){
Lookup lkp;
Collection<TestInterface> tests = null;
Template tmpl;
final Lookup.Result rslt;
lkp= Lookup.getDefault();
//lkp=Lookups.forPath("modules-path");
tmpl= new Template(TestInterface.class);
rslt= lkp.lookup(testTemplate);
tests = rslt.allItems();
Lookup.getDefault().lookup(TestInterface.class);
rslt.addLookupListener(new LookupListener() {
@Override
public void resultChanged(LookupEvent le) {
reaction(rslt);
}
});
reaction(rslt);
}
}
private static void reaction(Lookup.Result r) {
for (Iterator i = r.allInstances().iterator(); i.hasNext();) {
TestInterface s = (TestInterface) i.next();
System.out.println(s.somemethod());
}
}
有任何建议/提示如何解决?
答案 0 :(得分:1)
您可以将OSGi用于您的目的,而不是Netbeans Lookup。显然,您可以控制需要加载的jar文件,因此它应该可以正常工作。
您需要更改jar配置才能获得OSGi包。为此,您必须更改MANIFEST.MF文件,如下所述:
http://www.vogella.de/articles/OSGi/article.html#osgiarch_manifest http://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html?page=2
然后,您可以使用清单中定义的BundleActivator激活jar文件,如下所述:
http://www.vogella.de/articles/OSGi/article.html#codebundle
然后,您可以将捆绑包作为服务发布并在应用程序中使用它: