我尝试根据一些示例实现我自己的类加载器。但是,我认为它没有按预期工作(无法重新加载 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();