Я попытался реализовать свой собственный загрузчик классов на основе некоторых примеров. Однако я думаю, что он работает не так, как ожидалось (, не может перезагрузить файл Jar и т. д. Я вижу несколько ссылок на рекомендацию использовать OSGI или Apache Felix для обработки загрузки файла Jar. Есть ли примеры загрузки Jar, создания экземпляра класса из Jar?
Более подробная информация о том, что я пытаюсь выполнить. У меня есть приложение командной строки Java, которое по существу работает непрерывно. Я хочу, чтобы он мог динамически ссылаться на файлы JAR во время выполнения и во время выполнения -экземпляра класса в этих банках. Эти банки могут содержать 1 или более поддерживающих классов. Эти JAR-файлы, по сути, представляют собой настраиваемые рабочие единицы, которые выполняются при определенных условиях события из основного приложения, которое постоянно работает... Так как это мульти -клиент, я хотел, чтобы банки были подключаемыми рабочими единицами типа.
Мое текущее направление заключалось в том, чтобы предоставить «клиенту» интерфейс для кода, а затем заставить их упаковать свои классы в файл jar. Затем приложение выполнит настроенный (путь базы данных )jar и запустит класс из файла Jar. Это работает с загрузкой jar и класса, однако я хочу иметь возможность развертывать эти jar-файлы в горячем режиме.
Таким образом, я хотел бы иметь файл JAR, содержащий классы для поддержки функции. Определенный класс, на который будут ссылаться во время выполнения -из Jar (из основного приложения ). Возможность изменять файлы JAR во время работы основного приложения.
Если я буду использовать стороннюю библиотеку, предпочтительно, чтобы я использовал Apache Felix.
спасибо
Я думаю, что понял это, используя Apache Felix 4. Это лучший способ загрузить банки/классы? Или есть более эффективный способ. Мои исследования до сих пор не указывали на одно решение. Благодарю.
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();