Java 运行时注册JAR

Java 运行时注册JAR,java,jar,netbeans-platform,Java,Jar,Netbeans Platform,我想要一个模块化的应用程序,在运行时注册JAR模块。为此,我正在使用Netbeans查找API 问题是,我无法直接复制libraries文件夹中的某个JAR文件,因为运行的实例无法识别它。 在模块中,我配置了META-INF.services,其中包含接口的包名和模块包名 下面是我的代码示例: while(true){ Lookup lkp; Collection<TestInterface> tests = null; Template tmpl;

我想要一个模块化的应用程序,在运行时注册JAR模块。为此,我正在使用Netbeans查找API

问题是,我无法直接复制libraries文件夹中的某个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());
    }
}
while(true){
查找lkp;
集合测试=null;
模板tmpl;
最终查找结果rslt;
lkp=Lookup.getDefault();
//lkp=查找路径(“模块路径”);
tmpl=新模板(TestInterface.class);
rslt=lkp.lookup(testTemplate);
测试=rslt.allItems();
Lookup.getDefault().Lookup(TestInterface.class);
rslt.addLookupListener(新的LookupListener(){
@凌驾
公共无效结果已更改(LookupEvent le){
反应(rslt);
}
});
反应(rslt);
}
}
专用静态无效反应(Lookup.Result r){
for(迭代器i=r.allInstances().Iterator();i.hasNext();){
TestInterface s=(TestInterface)i.next();
System.out.println(s.somemethod());
}
}

有什么建议/提示可以解决吗?

您可以使用OSGi,而不是Netbeans查找。显然,您可以控制需要加载的jar文件,因此它应该可以正常工作

为了获得OSGi包,您需要更改jar配置。为此,您必须更改MANIFEST.MF文件,如下所述:

http://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html?page=2

然后,您可以使用清单中定义的BundleActivator激活jar文件,如下所述:

然后,您可以将捆绑包发布为服务,并在应用程序中使用它:


您可以使用OSGi,而不是Netbeans查找。显然,您可以控制需要加载的jar文件,因此它应该可以正常工作

为了获得OSGi包,您需要更改jar配置。为此,您必须更改MANIFEST.MF文件,如下所述:

http://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html?page=2

然后,您可以使用清单中定义的BundleActivator激活jar文件,如下所述:

然后,您可以将捆绑包发布为服务,并在应用程序中使用它:


我知道OSGi,我会考虑查找API是否是一个瓶颈。您知道在OSGi中是否可以在不声明库的情况下“插入”模块。例如,我只是在主模块运行时将jar放在文件夹中,然后主模块会识别它并使用动态插入模块的方法?我自己不是OSGi专家,我不想误导您,但我认为这是不可能的。据我所知,jar文件需要在其MANIFEST.MF文件中包含OSGi参数,以便OSGi识别。但是一个更有经验的建议是有用的…我知道OSGi,我会考虑查找API是否是一个瓶颈。您知道在OSGi中是否可以在不声明库的情况下“插入”模块。例如,我只是在主模块运行时将jar放在文件夹中,然后主模块会识别它并使用动态插入模块的方法?我自己不是OSGi专家,我不想误导您,但我认为这是不可能的。据我所知,jar文件需要在其MANIFEST.MF文件中包含OSGi参数,以便OSGi识别。但是一个更有经验的建议会很有用。。。