2013-05-18 132 views
0

我是Apache Felix的新用戶。我想創建基於Apache Felix框架的簡單桌面應用程序。我發現了this簡單的例子,如何創建一個簡單的主要方法作爲應用程序啓動框架,但我不知道如何添加服務到應用程序。如何將服務添加到桌面Apache Felix應用程序

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(); 
     } 
    } 
} 

如何添加位於外部JAR文件中的服務並將其用於將用於啓動應用程序的主jar文件?

+0

當你開始使用OSGi時,從更高的層次開始,從bndtools開始,它爲您提供開箱即用的OSGi。如果你覺得你想了解它是如何工作的,那麼很好,但是,然後閱讀規範或許多關於OSGi的較低級別書籍的書籍之一。我不認爲Stackoverflow問題旨在幫助您在信息豐富時開始使用技術。 –

回答

1

我已經開始了video,它解釋了服務和服務動態。在視頻中,您還可以看到如何使用BndTools(我強烈建議)。爲了註冊和使用服務,我們使用Apache Felix DependencyManager。

相關問題