Si haces esos frascos en paquetes OSGi (es decir, darles un MANIFIEST.MF), entonces se puede instálelos dinámicamente en el tiempo de ejecución de OSGi.
Si añade un activador de paquete a su plugin, a continuación, se pueden almacenar los org.osgi.framework.BundleContext y entonces usted puede hacer:
Bundle [] newBundle = new Bundle[] { bundleContext.install(location, newJarInputStream) };
packageAdmin.refreshPackages(newBundle);
packageAdmin.resolveBundles(newBundle);
packageAdmin
es una instancia de org.osgi.service. packageAdmin.PackageAdmin que es un servicio que puede adquirir con BundleContext#getService
Las nuevas jarras pueden ser paquetes completos por derecho propio, o también pueden ser paquetes de fragmentos que tienen su complemento como su host. Si son fragmentos de su paquete, entonces su paquete (BundleContext#getBundle()
) deberá incluirse en el conjunto pasado a refreshPackages y resolveresBundles.
(classloading EDIT) Class.forName
de su código del plugin sólo encontrará clases en los paquetes recién instalados si su plugin tiene dependencias que serán satisfechas por los nuevos paquetes, una vez que se resuelvan.
- Una forma de hacer esto sería un
Import-Package
opcional en el manifiesto de su complemento. En este caso, su complemento deberá incluirse en la matriz pasada al refreshPackages
.
- Otra opción sería usar una declaración
DynamicImport-Package
en el manifiesto de su complemento. Las importaciones dinámicas se resuelven durante la carga de clase
Otra opción es utilizar Bundle.loadClass
(en lugar de Class.forName) en los objetos del paquete para sus paquetes recién instalados. Esto utiliza el cargador de clases del nuevo paquete, por lo que su plugin no necesita tener una dependencia en los nuevos paquetes.
Esto suena como la forma correcta de hacerlo (+1) –
Gracias. Eso suena como un buen enfoque. Aunque todavía tengo algunos problemas. Logré cargar el paquete. Pero Class.forName ("MyClass") aún arroja una excepción ClassNotFound. Especifiqué el paquete, que contiene la clase en la declaración de exportación del manifiesto – Maria
Edité la respuesta original con más detalles sobre la carga de clases una vez que los paquetes están instalados. –