gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:16:42 24 4
gpt4 key购买 nike

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

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

我当前的方向是为“客户端”提供一个编码接口(interface),然后让他们将其类打包到 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();

最佳答案

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

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

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

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

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

关于jar - 寻找使用 Apache Felix 动态加载 Jar 文件并在 Java 运行时实例化类的基本示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11532621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com