寻找在Apache Jar动态加载中使用Apache Felix并在Java运行时实例化类的基本示例

use*_*269 5 osgi jar classloader apache-felix

我尝试根据一些示例实现自己的类加载器。但是,我认为它不能按预期方式工作(无法重新加载Jar文件等。我很少看到推荐使用OSGI或Apache Felix来处理Jar文件加载的参考。是否有加载Jar,实例化Jar中的类的示例?

关于我要完成的工作的更多详细信息。我有一个Java命令行应用程序,该应用程序实际上可以连续运行。我希望它能够在运行时动态引用JAR文件,并在运行时实例中引用这些jar中的类。这些罐子可能包含1个或多个支持类。这些Jar实质上是自定义的工作单元,可以通过连续运行的主应用程序中的某些事件条件执行这些Jar。..由于这是一个多客户端程序,所以我想让jars成为可插入类型的工作单元。

我目前的方向是为“客户端”提供编码接口,然后让他们将类打包在jar文件中。然后,应用程序将执行已配置的(数据库)jar路径,并从Jar中运行类。这适用于加载jar和类,但是,我希望能够从本质上热部署这些jar。

总而言之,我想创建一个JAR文件,其中包含支持功能的类。一个定义的类,它将在运行时从Jar(从主循环应用程序)中引用。在主应用程序运行时更改JAR文件的功能。

如果要使用第三方库,则最好使用Apache Felix。

谢谢

我想我是使用Apache Felix 4弄清楚的。这是加载jar /类的最佳方法吗?还是有更好更好的方法。到目前为止,我的研究并未指出一种解决方案。谢谢。

    FrameworkFactory ff = new FrameworkFactory ();
     Map<String,Object> config = new HashMap<String,Object>();
      config.put("org.osgi.framework.storage", "c:\\temp\\myclientBundles");
       config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
   "packages needed,more packages needed");
  config.put(Constants.FRAMEWORK_STORAGE_CLEAN, "true");

  Framework fwk = ff.newFramework(config);
  fwk.start();


  BundleContext bc = fwk.getBundleContext();

  Bundle bundle =   bc.installBundle("file:C:\\my_client.jar");


      bundle.start();
      bundle.update();
      Class clazz = bundle.loadClass("client.work.process");
      Job pc = (Job) clazz.newInstance();
      pc.startWork(someConfigObject);
      bundle.stop();
      fwk.stop();
Run Code Online (Sandbox Code Playgroud)

Pet*_*ens 2

如果现在,简单地说,我拒绝相信你的问题是加载类......:-) 我认为你还有另一个问题,你认为可以通过加载类来解决?

在大多数情况下,人们天真地开始加载类,问题在于可扩展性。他们有一个系统并希望有选择地使用新功能扩展它,我假设您有类似的问题,因为您想更新提供程序 jar?

如果是这样,请下载 bndtools 并查看 OSGi 服务,它们通常非常适合您的要求

好的,更新后。如果我很了解您,那么 Apache Felix 和 Apache Felix 文件安装将为您提供很好的服务。文件安装监视目录并安装框架中该目录中的任何包。从目录中删除该 jar 即可卸载该捆绑包。(我在 12 年前编写了文件安装的原型!)

对于您的主 JAR,使其看起来像:

@Component(immediate=true)
public void Main {  
    @Reference
    void setClient( Client client) { ... } // called whenever a client gets started
}
Run Code Online (Sandbox Code Playgroud)

对于每个客户端 JAR:

@Component
public void ClientImpl implements Client {
  ... whatever
}
Run Code Online (Sandbox Code Playgroud)

这实际上就是您使用 bndtools 时所需要编写的全部内容。只需创建一个组件项目,为主代码添加一个捆绑描述符,为客户端代码示例添加任意数量的描述符,然后运行为 -> OSGi 运行。然后,您可以下载 Apache Felix 文件安装,将其添加到运行选项卡,并创建一些其他项目,将 jars(在生成的文件夹中持续生成)放入文件安装文件夹中......瞧。没有比这更简单的了:-)