0

I'm new to Apache Felix. I want to create simple Desktop application based on Apache Felix framework. I found this simple example how to create simple main method which starts the framework as application but I'm not aware how to add services to the application.

package com.paint.servicebased;

import java.util.Map;
import java.util.ServiceLoader;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.launch.FrameworkFactory;

/**
 * This class provides a static {@code main()} method so that the bundle can be
 * run as a stand-alone host application. In such a scenario, the application
 * creates its own embedded OSGi framework instance and interacts with the
 * internal extensions to providing drawing functionality. To successfully
 * launch the stand-alone application, it must be run from this bundle's
 * installation directory using "{@code java -jar}". The locations of any
 * additional extensions that have to be started, have to be passed as command
 * line arguments to this method.
 */
public class Application
{

    private static Framework m_framework = null;

    /**
     * Enables the bundle to run as a stand-alone application. When this static
     * {@code main()} method is invoked, the application creates its own
     * embedded OSGi framework instance and interacts with the internal
     * extensions to provide drawing functionality. To successfully launch as a
     * stand-alone application, this method should be invoked from the bundle's
     * installation directory using "{@code java -jar}". The location of any
     * extension that shall be installed can be passed as parameters.
     * <p>
     * For example if you build the bundles inside your workspace, maven will
     * create a target directory in every project. To start the application from
     * within your IDE you should pass:
     * <p>
     *
     * <pre>
     * {@code file:../servicebased.circle/target/servicebased.circle-1.0.0.jar
     * file:../servicebased.square/target/servicebased.square-1.0.0.jar
     * file:../servicebased.triangle/target/servicebased.triangle-1.0.0.jar}
     * </pre>
     *
     * @param args The locations of additional bundles to start.
     *
     */
    public static void main(String[] args)
    {
        // Args should never be null if the application is run from the command
        // line.
        // Check it anyway.
        String[] locations = args != null ? args : new String[0];

        // Print welcome banner.
        System.out.println("\nWelcome to My Launcher");
        System.out.println("======================\n");

        try
        {
            Map<String, String> config = ConfigUtil.createConfig();
            m_framework = createFramework(config);
            m_framework.init();
            m_framework.start();
            installAndStartBundles(locations);
            m_framework.waitForStop(0);
            System.exit(0);
        }
        catch (Exception ex)
        {
            System.err.println("Could not create framework: " + ex);
            ex.printStackTrace();
            System.exit(-1);
        }
    }

    /**
     * Util method for creating an embedded Framework. Tries to create a
     * {@link FrameworkFactory} which is then be used to create the framework.
     *
     * @param config the configuration to create the framework with
     * @return a Framework with the given configuration
     */
    private static Framework createFramework(Map<String, String> config)
    {
        ServiceLoader<FrameworkFactory> factoryLoader = ServiceLoader
                .load(FrameworkFactory.class);
        for (FrameworkFactory factory : factoryLoader)
        {
            return factory.newFramework(config);
        }
        throw new IllegalStateException(
                "Unable to load FrameworkFactory service.");
    }

    /**
     * Installs and starts all bundles used by the application. Therefore the
     * host bundle will be started. The locations of extensions for the host
     * bundle can be passed in as parameters.
     *
     * @param bundleLocations the locations where extension for the host bundle
     * are located. Must not be {@code null}!
     * @throws BundleException if something went wrong while installing or
     * starting the bundles.
     */
    private static void installAndStartBundles(String... bundleLocations)
            throws BundleException
    {
        BundleContext bundleContext = m_framework.getBundleContext();
        Activator hostActivator = new Activator();
        hostActivator.start(bundleContext);
        for (String location : bundleLocations)
        {
            Bundle addition = bundleContext.installBundle(location);
            addition.start();
        }
    }
}

How I can add service which is located in external JAR file and use it into the main jar file which will be used to start the application?

Peter Penzov
  • 1,126
  • 134
  • 430
  • 808
  • When you're starting with OSGi it is much better to start on a higher level, e.g. start with bndtools, which gives you OSGi out of the box. If you feel that you want to understand how it all works, fine, but then read the spec or one of the many books about OSGi how the lower levels work. I do not think Stackoverflow questions are intended to help you get started with a technology when information is abundant. – Peter Kriens May 20 '13 at 07:05

1 Answers1

1

I've got a getting started video that explains services and service dynamics. In the video you also see how to use BndTools (which I highly recommend). For registering and consuming services we use Apache Felix DependencyManager.

Paul Bakker
  • 1,024
  • 7
  • 9