This header is not really aimed to include in bundles, the reason is that the Main class only scans those headers in jars in the root classpath (lib/* for karaf), not bundles. The idea is to be able to interact with the OSGi container from a jar in that classpath and not from a bundle.
My main (and only so far) use case for that is explained at http://servicemix.396122.n5.nabble.com/DISCUSS-Enhance-specs-to-work-better-with-JRE-td5001108.html On Tue, Nov 22, 2011 at 20:22, mikevan <[email protected]> wrote: > Guillaume, > > Will the maven-bundle-plugin be updated to allow the use of Karaf-Activator > in a maven build? Also, I'm unclear as to the use-case this addresses. > Could you provide some background so us lowly adopters can begin using it? > Also, what release will this new functionality be included in? > > > Guillaume Nodet wrote > > > > I use a non standard header for two reasons: > > * the jar does not need to be a bundle (i.e. it most certainly does not > > contain any osgi metadata and is not deployed as a bundle) > > * this is a karaf specific feature (even if reusing the osgi api, i > > could > > have written a new interface for it, but that did not bring any value to > > me) > > > > That use case was handled by Felix using a custom configuration property > > that one could set to a list / array of BundleActivator, but Equinox does > > not support such a mechanism. So given, it's specific to Karaf I thought > > it made more sense to use a different header. > > > > On Tue, Nov 22, 2011 at 14:19, Achim Nierbeck <bcanhome@>wrote: > > > >> Hi Guillaume, > >> > >> just out of curiosity why do we introduce a new non OSGi manifest > element > >> Karaf-Activator, instead of using the Bundle-Activator > >> for it? > >> > >> Regards, Achim > >> > >> 2011/11/22 <gnodet@> > >> > >> > Author: gnodet > >> > Date: Tue Nov 22 13:06:00 2011 > >> > New Revision: 1204967 > >> > > >> > URL: http://svn.apache.org/viewvc?rev=1204967&view=rev > >> > Log: > >> > [KARAF-1023] Add karaf activators for jars in the lib folder > >> > > >> > Modified: > >> > karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java > >> > > >> > Modified: > >> karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java > >> > URL: > >> > > >> > http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java?rev=1204967&r1=1204966&r2=1204967&view=diff > >> > > >> > > >> > ============================================================================== > >> > --- karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java > >> > (original) > >> > +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java Tue > >> Nov > >> > 22 13:06:00 2011 > >> > @@ -48,6 +48,7 @@ import java.util.Properties; > >> > import java.util.Random; > >> > import java.util.StringTokenizer; > >> > import java.util.TreeMap; > >> > +import java.util.jar.Manifest; > >> > import java.util.logging.Level; > >> > import java.util.logging.Logger; > >> > import java.util.regex.Matcher; > >> > @@ -59,6 +60,7 @@ import org.apache.karaf.main.util.Bootst > >> > import org.apache.karaf.main.util.StringMap; > >> > import org.apache.karaf.main.util.Utils; > >> > import org.osgi.framework.Bundle; > >> > +import org.osgi.framework.BundleActivator; > >> > import org.osgi.framework.BundleContext; > >> > import org.osgi.framework.BundleException; > >> > import org.osgi.framework.Constants; > >> > @@ -193,6 +195,10 @@ public class Main { > >> > > >> > public static final String INCLUDES_PROPERTY = "${includes}"; > >> > > >> > + public static final String KARAF_ACTIVATOR = "Karaf-Activator"; > >> > + > >> > + public static final String SECURITY_PROVIDERS = > >> > "org.apache.karaf.security.providers"; > >> > + > >> > Logger LOG = Logger.getLogger(this.getClass().getName()); > >> > > >> > private File karafHome; > >> > @@ -210,6 +216,8 @@ public class Main { > >> > private int shutdownTimeout = 5 * 60 * 1000; > >> > private boolean exiting = false; > >> > private ShutdownCallback shutdownCallback; > >> > + private List<BundleActivator> karafActivators = new > >> > ArrayList<BundleActivator>(); > >> > + > >> > > >> > public Main(String[] args) { > >> > this.args = args; > >> > @@ -281,6 +289,8 @@ public class Main { > >> > loadStartupProperties(configProps); > >> > processAutoProperties(framework.getBundleContext()); > >> > framework.start(); > >> > + // Start custom activators > >> > + startKarafActivators(classLoader); > >> > // Start lock monitor > >> > new Thread() { > >> > public void run() { > >> > @@ -289,6 +299,46 @@ public class Main { > >> > }.start(); > >> > } > >> > > >> > + private void startKarafActivators(ClassLoader classLoader) throws > >> > IOException { > >> > + Enumeration<URL> urls = > >> > classLoader.getResources("META-INF/MANIFEST.MF"); > >> > + while (urls != null && urls.hasMoreElements()) { > >> > + URL url = urls.nextElement(); > >> > + String className = null; > >> > + InputStream is = url.openStream(); > >> > + try { > >> > + Manifest mf = new Manifest(is); > >> > + className = > >> > mf.getMainAttributes().getValue(KARAF_ACTIVATOR); > >> > + if (className != null) { > >> > + BundleActivator activator = (BundleActivator) > >> > classLoader.loadClass(className).newInstance(); > >> > + activator.start(framework.getBundleContext()); > >> > + karafActivators.add(activator); > >> > + } > >> > + } catch (Throwable e) { > >> > + if (className != null) { > >> > + System.err.println("Error starting karaf > activator > >> " > >> > + className + ": " + e.getMessage()); > >> > + LOG.log(Level.WARNING, "Error starting karaf > >> > activator " + className + " from url " + url, e); > >> > + } > >> > + } finally { > >> > + if (is != null) { > >> > + try { > >> > + is.close(); > >> > + } catch (IOException e) { > >> > + } > >> > + } > >> > + } > >> > + } > >> > + } > >> > + > >> > + private void stopKarafActivators() { > >> > + for (BundleActivator activator : karafActivators) { > >> > + try { > >> > + activator.stop(framework.getBundleContext()); > >> > + } catch (Throwable e) { > >> > + LOG.log(Level.WARNING, "Error stopping karaf > activator > >> " > >> > + activator.getClass().getName(), e); > >> > + } > >> > + } > >> > + } > >> > + > >> > public void awaitShutdown() throws Exception { > >> > if (framework == null) { > >> > return; > >> > @@ -338,6 +388,7 @@ public class Main { > >> > } > >> > FrameworkEvent event = framework.waitForStop(step); > >> > if (event.getType() != FrameworkEvent.WAIT_TIMEDOUT) { > >> > + stopKarafActivators(); > >> > return true; > >> > } > >> > } > >> > @@ -457,7 +508,7 @@ public class Main { > >> > } > >> > } catch (Throwable ex) { > >> > main.setExitCode(-2); > >> > - System.err.println("Error occured shutting down > >> > framework: " + ex); > >> > + System.err.println("Error occurred shutting down > >> > framework: " + ex); > >> > ex.printStackTrace(); > >> > } finally { > >> > if (!restart) { > >> > @@ -468,7 +519,7 @@ public class Main { > >> > } > >> > > >> > private static void processSecurityProperties(Properties > >> > m_configProps) { > >> > - String prop = > >> > m_configProps.getProperty("org.apache.karaf.security.providers"); > >> > + String prop = m_configProps.getProperty(SECURITY_PROVIDERS); > >> > if (prop != null) { > >> > String[] providers = prop.split(","); > >> > for (String provider : providers) { > >> > @@ -1072,7 +1123,6 @@ public class Main { > >> > * Returns a path for an srtifact. > >> > * Input: path (no ':') returns path > >> > * Input: mvn:<groupId>/<artifactId>/<version>/<type>/<classifier> > >> > converts to default repo location path > >> > -// * Input: <groupId>:<artifactId>:<version>:<type>:<classifier> > >> > converts to default repo location path > >> > * type and classifier are optional. > >> > * > >> > * > >> > > >> > > >> > > >> > >> > >> -- > >> > >> Apache Karaf <http://karaf.apache.org/> Committer & PMC > >> OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> > >> Committer & > >> Project Lead > >> blog <http://notizblog.nierbeck.de/> > >> > > > > > > > > -- > > ------------------------ > > Guillaume Nodet > > ------------------------ > > Blog: http://gnodet.blogspot.com/ > > ------------------------ > > Open Source SOA > > http://fusesource.com > > > > > ----- > Mike Van (All links open in new tabs) > Committer - Kalumet > > Atraxia Technologies > > NCI Inc > > Mike Van's Open Source Technologies Blog > -- > View this message in context: > http://karaf.922171.n3.nabble.com/Re-svn-commit-r1204967-karaf-trunk-main-src-main-java-org-apache-karaf-main-Main-java-tp3527681p3528753.html > Sent from the Karaf - Dev mailing list archive at Nabble.com. > -- ------------------------ Guillaume Nodet ------------------------ Blog: http://gnodet.blogspot.com/ ------------------------ Open Source SOA http://fusesource.com
