Showing posts with label Equinox. Show all posts
Showing posts with label Equinox. Show all posts

Monday, August 21, 2017

OSGi Sample Bundle Development with Eclipse

OSGi is java modularity development framework. We can divide complex application into multiple modules and OSGi will responsible to communicate all modules and make it as single application.

OSGi is framework provides the run time environment so that all these module can communicate each other. In OSGi terminology we can call each unit as bundle. Bundle is independent component in OSGi and it can run in OSGi container. OSGi container is responsible to handle lifecycle of bundle.

Follow below articles for Basics of OSGi and Bundles





In this article we are going to see develop basic bundle development using eclipse and will run in OSGi run time environment.

Basic OSGi bundle development without eclipse and run in Apache Felix OSGi run time environment was explained in below article.


Prerequisite.

Install Java 8 and set JAVA_HOME environment variable.

Download latest version of Eclipse from below link


We are using eclipse-jee-oxygen for this example.

Any bundle in OSGi need activator java class and it is responsible for managing bundle lifecycle in the OSGi container. So each activator class should extends “BundleActivator”.
When we create bundle with eclipse it will create basic template with Activator class and if we observed the activator class, that extends “BundleActivator” class.

Once you download the eclipse extract it local machine then you can find “eclipse” directory. Navigate to “eclipse” then click on eclipse icon then eclipse will be started and initially it will ask workspace for your projects then select your workspace directory.



Create OSGi sample bundle in Eclipse.

Go to File à New à Project

It will open project selection Dialog then select “Plugin-in Project” click on next.



Once click on next then you can see another dialog there we need to provide your project name then click on next.

Project Name: com.liferaysavvy.example.LiferaySavvyWorld
Plugin-in Targeted Run with Select OSGi framework à Standard



Once click on next we can see other dialog there it will ask information which will be used in the bundle MANIFEST file. Information like name, version, vendor and execution environment.

Click on Generate Activator class check box then give your Activator class name.


Once click on Next it will ask you select OSGi template and click on Crete Plugin using template then select “Hello OSGi” so that it will generate bundle with activator class with lifecycle methods



 Finally click on finish button then bundle will create with basic activator class.
The following is basic OSGi bundle project view in eclipse



Activator

Activator is java class which handle the bundle lifecycle management in the OSGi container. It will extends the “BundleActivator” class. We have different lifecycle methods as follows

start(--) :  This method will take the argument BundleContext and container will invoke this method to start bundle.

stop(--): This method also take BundleContext as argument and OSGi container will invoke this method to stop bundle.


package com.liferaysavvy.example.liferaysavvyworld;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

     /*
      * (non-Javadoc)
      * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
      */
     public void start(BundleContext context) throws Exception {
           System.out.println("Say Liferay Savvy World!!");
     }
    
     /*
      * (non-Javadoc)
      * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
      */
     public void stop(BundleContext context) throws Exception {
           System.out.println("Goodbye Liferay Savvy World!!");
     }

}


MANIFEST.MF:

MANIFEST.MF is deployment descriptor for the bundle and have more information and it will be used by OSGi container. This is core resource of the bundle.


Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: LiferaySavvyWorld
Bundle-SymbolicName: com.liferaysavvy.example.LiferaySavvyWorld
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.liferaysavvy.example.liferaysavvyworld.Activator
Bundle-Vendor: LIFERAYSAVVY
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Import-Package: org.osgi.framework;version="1.3.0"


Bundle-ManifestVersion:

 This header tells that bundle follows the OSGi specification and value 2 specified, it is following SGi specification Release 4; if it is value 1 its means it is following the compliant with Release 3 or earlier.

Bundle-Name

Its human readable bundle name

Bundle-SymbolicName:

Its important header for bundle and it is unique name used to refereeing it in other bundles when it communicate to other bundles.

Bundle-Version:

Its simple version number for the bundle. We can start and run version specific bundles in the OSGi container.

Bundle-Activator

Bundle-Activator headers tells the Activator class name and it will used to manage life cycle of bundle by OSGi container.

Bundle-Vendor

The Bundle-Vendor header is just human readable name which tell the vendor who implemented the bundle.

Bundle-RequiredExecutionEnvironment:

Which tell the Jave environment is required to execute the bundle.

Import-Package

This header is very important and it tells which packages are required to execute the bundle. When the bundle depends on the other bundle then we have specify the bundle symbolic name so that it will be handled by the OSGi container. Basically each bundle must import OSGi implantation bundle it’s like “org.osgi.framework;”

Executing a bundle

Select bundle and right click on bundle

Run As à Run Configuration





Select your bundle and Select “org.eclipse.osgi” for Target platform then Apply à Run



You can see Output in the console as follows. Bundle will be started by OSGi container then it will invoke activator start method start() then we can see message in the console.





If you want execute bundle in Apache Felix environment then select Apache Felix OSGi implementation for Targeted platform.
Just type Felix in the filter text input then you can see Felix implementation jars.



If you want execute bundle in OSGi equinox then select targeted platform equinox

We can also export bundle and execute in standalone OSGi containers. Just export bundle as JAR file from eclipse and run jar file in other OSGi containers
Here is example how to run bundle in Apache Felix Environment. Look at “Install and Start bundle in OSGi” Section.


Author

Sunday, December 20, 2015

Open Services Gateway Initiative (OSGi) Introduction

The Open Services Gateway Initiative (OSGi) is specification that defines modular based software management and its execution. OSGi makes software management and its execution simpler by making large application into small bunch of pieces and we call it as module. These modules are working independent way so that when we need we can start module and we can stop module. As for OSGi a module is Bundle or Plugin-in

OSGi provides execution environment so that we can install, start and stop module whenever we required such a way OSGi provides OSGi containers to manage lifecycle of these bundles.

Bundle/Plug-In/Software component

Bundle is a collection Java classes and resources make it as package then we call it as bundle and these bundle can be working as independent or it can be depends on other bundle or plugin. We can say bundle is small piece of software and as for OSGi we can specify as OSGi bundle.

Note:

As for our understand bundle is java jar file.

OSGi specification


OSGi implementations

After release of OSGi specification by OSGi Alliance in March 1999 then people implemented specifications as software and the following are popular implementation software open source groups.

Equinox

Equinox is reference implementation of OSGi from eclipse and they have implanted OSGi software so that it provides runtime environment for OSGi based software development.


Apache Felix

Felix is also implemented OSGi specification from Apache and its open source implementation.


Knopflerfish

Knopflerfish is another Open source Implementation for OSGi


Note:

All above implementation covered all specifications of OSGi R3 and OSGi R4 specifications.

Software Developers can use any one of the implementation to implement their software as modular based way. We can also inherited features from above all implementations.

All OSGi implementations they packages as jar file so that it will provide execution environment for OSGi bundles. OSGi have basic standalone container to execute bundles and if we want other environments support we need to take relevant environment support bundle so that it will provide execution environment for different kind of environment.

Basic OSGi implementation Jars

From Apache Felix


felix.jar


Start the framework

From the installation directory by typing in the terminal


java -jar bin/felix.jar


From Eclipse Equinox


org.eclipse.osgi_3.2.0.jar


Start OSGi Framework


java -jar org.eclipse.osgi_3.2.0.jar –console


The above implementation jars covered all specification that defined by OSGi so that we can develop OSGi bundles then we can run it on OSGi containers.

OSGi bundle Lifecycle

As for software development mode each software component have its own lifecycle same way OSGi bundle also have its own lifecycle and these lifecycle will be manged by OSGi Framework implementation software or we can say OSGi containers.
The following are OSGi bundle lifecycle stages


Install
Resolved
Uninstall
Start
Active
Stop


Install

Install is start point to OSGi bundle and we need to install OSGi bundle with help OSGi commands then Bundle will be available in OSGi container.

Resolve

In the resolve stage it will check all dependent bundles and its required bundles if everything satisfied then it will moved to other stage otherwise it will be uninstalled.

Uninstall

Uninstall is completely removing OSGi bundle from OSGi container and this we can manually uninstall with command or If the bundle not resolved by all decencies then it’s automatically uninstalled.

Start

After all dependencies and required bundles are resolved then bundle will be started, once bundle is started then it will be available for use.

Active

Once bundle available to use in OSGi container then we will make it active so that it will be under real usage and it we can experience as end user.

Stop

Stop stage we can make OSGi bundle inactive so that it will not available for real use but still Bundle available for OSGi container.



The following are the commands to working with OSGi Bundle lifecycle

Apache Felix

The following are the commands to working with bundle lifecycle and we need to provide bundle path as variable for each command.


felix:install file:/path/to/bundle/bundle.jar

felix:start file:/path/to/bundle/bundle.jar

felix:stop file:/path/to/bundle/bundle.jar

felix:update file:/path/to/bundle/bundle.jar

felix:uninstall file:/path/to/bundle/bundle.jar


To work with shell based commands Apache Felix uses another OSGi bundle called Apache Felix GOGO

Apache Felix GOGO

Apache Felix GOGO is sub project of Apache Felix and it provide command based interface to working with OSGi bundles lifecycle.



The Gogo subproject of Apache Felix and its consists of three bundles

Runtime

Implements the core command processing functionality.

The following is Bundle implemented Runtime

org.apache.felix.gogo.runtime.jar

Shell

 Provides a simple textual user interface to interact with the command processor.
The following is Bundle implemented Shell

org.apache.felix.gogo.shell.jar

Command

 Implements a set of basic commands.

org.apache.felix.gogo.command.jar

Note:

Apache Felix GoGo is already included in the Apache Felix Framework Software so as soon as we start Felix OSGi jar file then it will be available as console so that we can use above specified commands to manage bundle lifecycle.

Example Gogo Console

Open your terminal in you system start Felix Framework jar file then you can see Apache Felix GoGo console.


$ cd felix-framework-3.0.0
$ java -jar bin/felix.jar
_______________
Welcome to Apache Felix Gogo

g! lb
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (3.0.0)
    1|Active     |    1|Apache Felix Bundle Repository (1.6.2)
    2|Active     |    1|Apache Felix Gogo Command (0.6.0)
    3|Active     |    1|Apache Felix Gogo Runtime (0.6.0)
    4|Active     |    1|Apache Felix Gogo Shell (0.6.0)
    5|Installed  |    1|Example Bundle (1.0.0)
g! start 5
Hello from Bundle 5.
g!


lb command list the available bundle in OSGi container and to start the bundle we can specify the bundle order number as argument.

Equinox

Similar to Apache Felix equinox also have similar commands and its console to work with bundle lifecycle


install <bundle URL>

Installs the bundle from the given URL

start <bundle # or bundle name>

Starts the bundle with the given numeric or symbolic id

stop <bundle # or bundle name>

Stops the bundle with the given numeric or symbolic id

ss

Reports a summary status of all installed bundles

diag <bundle # or bundle name>

 Reports any resolution problems for the bundle with the given numeric or symbolic id


Equinox also implemented OSGi console using following bundle


org.eclipse.equinox.console.jar


Internally Equinox also used Apache Felix gogo to provide command line interface and along with Equinox console.

Example of Equinox Console


osgi> ss
"Framework is launched."


id         State       Bundle
0          ACTIVE      org.eclipse.osgi_3.10.0.v20140606-1445
1          ACTIVE      org.apache.felix.gogo.runtime_0.10.0.v201209301036
2          ACTIVE      org.apache.felix.gogo.command_0.10.0.v201209301215
3          ACTIVE      com.meera.sample.HelloWorld_1.0.0.qualifier
4          ACTIVE      org.apache.felix.gogo.shell_0.10.0.v201212101605
5          ACTIVE      org.eclipse.equinox.console_1.1.0.v20140131-1639

osgi> stop 3
Goodbye World!!

osgi> start 3
Hello World!!
Osgi


SS will use to list available bundles in OSGi container and we will use Bundle number in to start or stop bundle.

To work with Basic OSGi development using Apache Felix we need following bundles


felix.jar
org.apache.felix.gogo.runtime.jar
org.apache.felix.gogo.command.jar
org.apache.felix.gogo.shell.jar


To work with Basic OSGi development using Equinox we need following bundles


org.eclipse.osgi_3.10.0.jar
org.apache.felix.gogo.runtime.jar
org.apache.felix.gogo.command.jar
org.apache.felix.gogo.shell.jar
org.eclipse.equinox.console.jar


If we want work with other environments such as web applications we should have other OSGi bundle to provide execution run time environment.

Example:

To work with web application environment using OSGi we need following OSGi implementation bundles


Apache Felix HTTP Service



Apache Felix Web Console



Apache Felix Log




Similarly we need different implementation OSGi bundle to provide different types of environments.

In this case we need to setting up required bundles so that we can create execution environment rather than this there is project from Apache called Apache Arise it will provide all types of pluggable OSGi plugins to create different types of execution environment

Apache Aries

The Aries project consists of a set of pluggable Java components enabling an enterprise OSGi application programming model. This includes implementations (and extensions) of the following Enterprise OSGi specifications




Asynchronous Services and Promises Specification
Blueprint Specification
JTA Transaction Services Specification
JMX Management Model Specification
JNDI Services Specification
JPA Service Specification
Service Loader Mediator Specification
Subsystem Service Specification


Recent Posts

Recent Posts Widget

Popular Posts