This is a draft of possible migration to OSGi |
Sonar Plugin - https://github.com/SonarSource/sonar-update-center/blob/master/sonar-update-center-common/src/main/java/org/sonar/updatecenter/common/PluginManifest.java
OSGi Bundle - http://www.osgi.org/javadoc/r4v42/index.html?org/osgi/framework/Constants.html
Sonar Plugin |
OSGi Bundle |
Notes |
|---|---|---|
Plugin-Key |
Bundle-SymbolicName |
|
Plugin-Version |
Bundle-Version |
|
Plugin-Class |
Bundle-Activator ? |
|
Plugin-Name |
Bundle-Name |
|
Plugin-Description |
Bundle-Description |
|
Plugin-Homepage |
Bundle-DocURL |
|
Plugin-Dependencies |
Bundle-ClassPath |
|
Plugin-ChildFirstClassLoader |
not needed |
|
Plugin-Base |
Fragment-Host |
Fragment bundle can't be referenced from another manifest. Fragment bundle cannot load classes. Fragment treated as optional bundle. |
Sonar-Version |
Require-Bundle |
|
"org.sonar.plugin.<key>.api.*" |
Export-Package |
|
Plugin-License |
Bundle-Copyright |
|
Plugin-BuildDate |
|
|
Plugin-IssueTrackerUrl |
Bundle-ContactAddress |
|
Plugin-Organization |
Bundle-Vendor |
|
Plugin-TermsConditionsUrl |
|
|
|
Bundle-UpdateLocation |
We have a lot of routines for installation and uninstallation of plugins and for creation of classloaders.
Here is example how to launch embedded Equinox ( org.eclipse.osgi:org.eclipse.osgi:3.6.0.v20100517 - no additional dependencies, size about 1 Mb ) :
EquinoxFactory factory = new EquinoxFactory();
Map<String, Object> config = new HashMap<String, Object>();
config.put("osgi.configuration.area", "/tmp/osgi-dir/");
Framework framework = factory.newFramework(config);
framework.start();
BundleContext context = framework.getBundleContext();
Bundle bundle = context.installBundle("file:/..."); // Jar file or directory, seems that "http://" supported too
...
Class<?> cls = bundle.loadClass("...");
...
framework.stop();
|
OSGi also provides routines to correctly compare versions - see http://www.osgi.org/javadoc/r4v42/index.html?org/osgi/framework/Version.html.