Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programmatically Start OSGi (Equinox)?

Tags:

java

maven

osgi

pax

I'd like to be able to easily start an OSGi framework (preferably Equinox) and load up any bundles listed in my pom from a java main.

Is this possible? If so, how?

It seems like the pax tools would do this, but I can't seem to find any documentation indicating such. I know I can start up Equinox like so:

BundleContext context = EclipseStarter.startup( ( new String[] { "-console" } ), null );

But I'd like to do more - like I said: load more bundles in, maybe start some services, etc.

like image 267
javamonkey79 Avatar asked Jan 12 '11 19:01

javamonkey79


People also ask

What is OSGi stands for?

The OSGi (Open Service Gateway Initiative) specification is a Java framework for developing and deploying modular software programs and libraries.

What is OSGi framework Java?

OSGi defines a dynamic module system for Java™. The OSGi service platform has a layered architecture, and is designed to run on various standard Java profiles. OSGi Applications deployed to WebSphere® Application Server run on an Enterprise Java profile that is provided as part of the server runtime environment.

What is OSGi in eclipse?

OSGi, The Dynamic Module System for Java Its proven services model enables application and infrastructure modules to communicate locally and distributed across the network, providing a coherent end-to-end architecture. OSGi specifications have been extensively field-tested and are ready to use.


3 Answers

Any OSGi framework (R4.1 or later) can be started programmatically using the FrameworkFactory API:

ServiceLoader<FrameworkFactory> ffs = ServiceLoader.load(FrameworkFactory.class);
FrameworkFactory ff = ffs.iterator().next();
Map<String,Object> config = new HashMap<String,Object>();
// add some params to config ...
Framework fwk = ff.newFramework(config);
fwk.start();

The OSGi framework is now running. Since Framework extends Bundle you can call getBundleContext and call all of the normal API methods to manipulate bundles, register services, etc. For example

BundleContext bc = fwk.getBundleContext();
bc.installBundle("file:/path/to/bundle.jar");
bc.registerService(MyService.class.getName(), new MyServiceImpl(), null);
// ...

Finally you should simply wait for the framework to shutdown:

fwk.stop();
fwk.waitForStop(0);

To reiterate, this approach works for any OSGi framework including Equinox and Felix just by putting the framework JAR on the classpath.

like image 104
Neil Bartlett Avatar answered Sep 30 '22 21:09

Neil Bartlett


This thread might be a bit stale, but anyway...

Pax has excellent support for maven urls, it even has a wrap url handler allowing you to dynamically convert non-osgi jar to nice tidy bundles.

http://wiki.ops4j.org/display/paxurl/Mvn+Protocol

    <dependency>
        <groupId>org.ops4j.pax.url</groupId>
        <artifactId>pax-url-wrap</artifactId>
        <version>1.2.5</version>        
    </dependency>
    <dependency>
        <groupId>org.ops4j.pax.url</groupId>
        <artifactId>pax-url-mvn</artifactId>
        <version>1.2.5</version>        
    </dependency>

The command would then be:

install -s mvn:groupId:artifactId:version:classifier

Note: chicken-egg scenario - you have to install these using a file: url handler first or put them into an autodeploy directory.

Karaf has this all build in to it's distro, so maybe have a look at Karaf launcher source?

2nd note: deploying snapshots are enable by appending @snapshots to the repo URL, configuration is managed via ConfigAdmin

In terms of managing all your POM defined dependencies have a look at Karaf features - there's a plugin that would enable to generate a features XML file which can then be used to deploy your entire app: http://karaf.apache.org/manual/2.1.99-SNAPSHOT/developers-guide/features-maven-plugin.html

Further more this XML artifact can be deployed to your OBR, so you can take a vanilla Felix/Equinox/Karaf setup, add the mvn url handler and configure with your company's mvn repo then provision the entire app =)

like image 23
earcam Avatar answered Sep 30 '22 21:09

earcam


Edit: Realized you wanted to start from inside java. Shame on me for not reading close enough

Check out this link. http://www.eclipsezone.com/eclipse/forums/t93976.rhtml

Essentially

public static void main(String args[]) throws Exception {
  String[] equinoxArgs = {"-console","1234","-noExit"};
  BundleContext context = EclipseStarter.startup(equinoxArgs,null);
  Bundle bundle = context.installBundle(
    "http://www.eclipsezone.com/files/jsig/bundles/HelloWorld.jar");
  bundle.start();
}

Edit: Maven

It seems that https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 contains an OSGi URl Handlers Service that can take URLS of the following format and load bundles from them ( mvn://repo/bundle_path )

like image 4
KitsuneYMG Avatar answered Sep 30 '22 23:09

KitsuneYMG