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

     2023-02-22     114

关键词:

【中文标题】寻找在动态加载 Jar 文件和在 Java 运行时实例化类时使用 Apache Felix 的基本示例【英文标题】:Looking for basic example of using Apache Felix in dynamic loading of Jar file and instancing a class at runtime in Java 【发布时间】:2012-07-16 23:19:35 【问题描述】:

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

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

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

总之,我想要一个 JAR 文件,其中包含支持某个功能的类。将在运行时从 Jar(来自主循环应用程序)引用的已定义类。在主应用程序运行时更改 JAR 文件的能力。

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

谢谢

我想我是使用 Apache Felix 4 解决的。这是加载 jars/classes 的最佳方式吗?或者有没有更好更有效的方法。到目前为止,我的研究并没有指向一种解决方案。谢谢。

    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();

【问题讨论】:

问题:我必须将类所需的所有包添加到 FrameWorkFactory 和 bundle jar 清单文件中吗?有没有更好的方法来处理这个问题?通配符不起作用。我的意思是我正在使用的 jars/bundle 有几个依赖项。 【参考方案1】:

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

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

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

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

对于你的主 JAR,让它看起来像:

@Component(immediate=true)
public void Main   
    @Reference
    void setClient( Client client)  ...  // called whenever a client gets started

对于每个客户端 JAR:

@Component
public void ClientImpl implements Client 
  ... whatever

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

【讨论】:

感谢您的回复。对于主应用程序,我不需要通过启动OSGI框架并获取相应的类实例的过程吗?对于客户端 jar,我正在学习 bndtools 插件。我越来越熟悉,但不确定如何“发布”或提供捆绑包的执行方法。我可能有点偏离轨道,但我更接近几天前的位置。再次感谢您的帮助 有两种方法。你可以保持你的主应用程序不变并嵌入一个 OSGi 框架(Apache Felix 有一个很好的教程,它也适用于其他框架:felix.apache.org/site/…)。如果您在该嵌入式框架中安装 FileInstall,您会自动在加载(或工作)目录中加载任何包(和配置)。如果这些注册服务,您可以使用主应用程序中的服务跟踪器跟踪它们,这会在服务注册时为您提供回调。否则,请将您的应用程序打包。【参考方案2】:

如果我理解正确,您是在询问如何在 OSGi 中动态加载 jar 的示例,对吗?

在 OSGi 中,动态加载的模块称为捆绑包。 因此,基本上解决您的问题的最常用方法是将您的 jar 放入 OSGi 捆绑包中。 OSGi 包是一个普通的 Java jar,有一些增强 - 它有一个清单文件(一个 txt 文件),其中声明了对其他 Java 包的依赖关系;以及一个 Activator 类,它在包启动和停止时被调用。这个 Activator 是包的核心部分,它知道如何实例化包的其他部分。

现在,如果您的动态 jar 只是一个库 jar,并且您只想在系统中提供它的 java 包,您甚至可以不使用激活器,只需添加一个简单的清单文件。甚至还有一些工具可以为您自动进行转换 - 请查看 BND。

然后,当您准备好捆绑包时,您可以使用 install 命令在任何 OSGi 框架上动态安装它。重新加载是通过调用更新命令等来完成的。生命周期定义得很好,我肯定会推荐使用它而不是重新发明***;)

有关示例和演示,请参阅here。

希望这会有所帮助。

【讨论】:

我确实看到了这个 BNDtools 非常有用的地方。关于将 jar 文件转换为捆绑包的任何好的教程?我一直在使用遵循某种模式的 jar 和遵循接口的类。我对 BNDTools 和捆绑包构建的了解仍然是基础知识,因此感谢您提供任何信息。谢谢

java示例代码_在运行时加载jar文件

java示例代码_在运行时加载jar文件 查看详情

如何在运行时加载 jar 文件 [重复]

】如何在运行时加载jar文件[重复]【英文标题】:Howtoloadajarfileatruntime[duplicate]【发布时间】:2010-09-1617:16:08【问题描述】:我被要求构建一个能够在运行时加载新代码(扩展)的Java系统。如何在我的代码运行时重新加载jar文件... 查看详情

java示例代码_在运行时从文件夹或JAR加载类

java示例代码_在运行时从文件夹或JAR加载类 查看详情

java示例代码_如何在运行时将外部jar文件动态添加到类路径

java示例代码_如何在运行时将外部jar文件动态添加到类路径 查看详情

关于java动态加载jar的问题?

...层级关系,当某个类找不到时,它会去他的父类加载器去寻找,如果依然找不到,就抛出ClassNotFoundException了。为了动态加载hello.jar里面的Util类,我们需要将这个jar包放入到我们的类加载器中去,然后再获取里面的类。如下面的... 查看详情

java示例代码_在运行时从文件夹加载jar文件&;在JBoss EAP 6.0.1中实例化类

java示例代码_在运行时从文件夹加载jar文件&;在JBoss EAP 6.0.1中实例化类 查看详情

java运行时动态加载类之classloader

https://blog.csdn.net/fjssharpsword/article/details/64922083***************************************************************************需求场景:动态加载类ClassLoaderd,在xml文件中配置加载类名称和方法,:一、准备1)在D: mp目录下配置a. 查看详情

java可以动态加载一个jar包,并且调用里面的类和方法吗?

...很多class的的地方,jar包放入classpath后,其实只要能实现动态的加载类就可以实现题目中的需求了技术是java反射机制,就是一个利用提供类全名而得到这个类实例的机制通过反射得到Class这个类,然后可以得到关于这个类的方法... 查看详情

Java 的类加载器与 jars-within-jars

...们骑在太空中部署的巨型海龟的背上。)在运行时,我们动态加载嵌套的JAR文件,执行以下操作://wearyinglyverboseerr 查看详情

在运行时通过 java 中的命令提示符加载配置文件(project.properties)

】在运行时通过java中的命令提示符加载配置文件(project.properties)【英文标题】:loadconfigfile(project.properties)atruntimeviacommandpromptinjava【发布时间】:2014-05-1504:09:48【问题描述】:我想在java中通过命令提示符加载属性文件。属性... 查看详情

Java:从 JAR 运行时的文件路径

...用样式表的Java/JavaFX项目。样式表中的图像将按如下方式加载:#pane-fx-background-image:url(\'../packagename/image.jpg\');当我从Eclipse或Scenebuilder编译和运行它时 查看详情

java示例代码_Android:如何从JAR文件动态加载类

java示例代码_Android:如何从JAR文件动态加载类 查看详情

运行jar文件时Java找不到主类[重复]

...当我从控制台启动jar文件时,它显示:错误:无法找到或加载主类com.company.Main我在IntelliJIDEA工作,只是创建了新的控制台应用程序并将jar添 查看详情

运行 java 文件时无法使用 JAR 文件

】运行java文件时无法使用JAR文件【英文标题】:UnabletouseJARfilewhenrunningajavafile【发布时间】:2022-01-0820:00:56【问题描述】:当我通过命令提示符运行它时,我一直在尝试在我的java程序中使用JAR文件(“sqlite-jdbc-3.7.2.jar”),但... 查看详情

加载时动态链接和运行时动态链接之间的区别

】加载时动态链接和运行时动态链接之间的区别【英文标题】:Differencebetweenload-timedynamiclinkingandrun-timedynamiclinking【发布时间】:2011-01-0413:53:12【问题描述】:将程序加载到内存时,加载时动态链接和运行时动态链接有什么区别... 查看详情

java动态加载jar和class文件

JAVA中类文件加载是动态的。也就是说当我们用到的时候才会去加载,如果不用的话,就不会去加载我们的类。JAVA为我们提供了两种动态机制。第一种是隐式机制。第二种是显示机制。如下:两种方法:隐式机制:n... 查看详情

java示例代码_使drools drl文件访问在运行时更新jar

java示例代码_使drools drl文件访问在运行时更新jar 查看详情

jvm学习四:深入分析classloader(代码片段)

...是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。二、Java默... 查看详情