嵌入OSGI声明服务包工作正常但没有输出可见

时间:2014-01-07 06:33:12

标签: service osgi equinox osgi-bundle

我正在尝试嵌入在我的java应用程序中使用的OSGI包。

下面是我在捆绑中唯一的java文件(我现在做的很简单):

package it.eng.test.ds.consumer;

public class Consumer {


    public void activate(){
        System.out.println("I'm here, in the activate ds automatic method ;)");
    }

    public void deactivate()
    {
        System.out.println("Bye Bye!");
    }

}

以下是consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="it.eng.test.ds.consumer"
activate="activate" 
deactivate="deactivate"
modified="modified"
enabled="true" 
immediate="true">
   <implementation class="it.eng.test.ds.consumer.Consumer"/>

</scr:component>

以下是MANIFEST.MF

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Ds-bundle
Bundle-SymbolicName: it.eng.test.ds.consumer
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
-Component: OSGI-INF/consumer.xml

接下来,我在我的应用程序中嵌入了equinox,启动了必需的bundle(org.eclipse.equinox.ds及其依赖项),最后启动了我的名为it.eng.test.ds.consumer_1.0.0.201401071018.jar的bundle。

以下是我的申请代码:

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
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;


public class MainEmbedder {


    public static void main(String[] args)
    {


        FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
        Map<String, String> config = new HashMap<String, String>();


        //TODO: add some config properties
        Framework framework = frameworkFactory.newFramework(config);
        try {
            framework.start();
        } catch (BundleException e) {

            e.printStackTrace();
        }


        BundleContext context = framework.getBundleContext();
        List<Bundle> installedBundles = new LinkedList<Bundle>();

        try {



            installedBundles.add(context.installBundle("file:C:\\Users\\student\\Desktop\\DS-Plugins\\org.eclipse.osgi.services_3.3.100.v20120522-1822.jar"));


            installedBundles.add(context.installBundle("file:C:\\Users\\student\\Desktop\\DS-Plugins\\org.eclipse.equinox.util_1.0.200.v20100503.jar"));

            installedBundles.add(context.installBundle(
                                 "file:C:\\Users\\student\\Desktop\\DS-Plugins\\org.eclipse.equinox.ds_1.4.1.v20120926-201320.jar"));


            installedBundles.add(context.installBundle(
                    "file:C:\\Users\\student\\Desktop\\DS-Plugins\\plugins\\it.eng.test.ds.consumer_1.0.0.201401071018.jar"));




        } catch (BundleException e) {
            e.printStackTrace();
        }


        for (Bundle bundle : installedBundles) {

            try {
                bundle.start();


            } catch (BundleException e) {

                e.printStackTrace();
            }

        }System.out.println("after starting bundles");





    }
}

当我运行我的应用时,我可以看到消息"after starting bundles",但我看不到消息"I'm here, in the activate ds automatic method ;)"。这意味着我的包没有进入activate方法。这是为什么?我怎么解决这个问题?谢谢。

更新
我尝试使用以下代码启动与Felix框架的捆绑包:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.felix.framework.Felix;
import org.apache.felix.framework.util.FelixConstants;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;

public class HostApplication
{
    private HostActivator m_activator = null;
    private Felix m_felix = null;


    public HostApplication()
    {
        // Create a configuration property map.
        Map config = new HashMap();
        config.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);
        // Create host activator;
        m_activator = new HostActivator();
        List list = new ArrayList();
        list.add(m_activator);

        config.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);

        try
        {
            // Now create an instance of the framework with
            // our configuration properties.
            m_felix = new Felix(config);
            // Now start Felix instance.
            m_felix.start();
        }
        catch (Exception ex)
        {
            System.err.println("Could not create framework: " + ex);
            ex.printStackTrace();
        }




        // Register the application's context as an OSGi service!
        BundleContext bundleContext1 = m_felix.getBundleContext();



                System.out.println("6");

                try {
                    Bundle dsBundle = bundleContext1.installBundle("file:C:\\Users\\student\\Desktop\\DS-Plugins\\org.apache.felix.scr-1.8.0.jar");
                    dsBundle.start();
                    if(dsBundle.getState()== dsBundle.ACTIVE)
                        System.out.println("DS Bundle is Active!");

                    Bundle consumerBundle = bundleContext1.installBundle("file:C:\\Users\\student\\Desktop\\DS-Plugins\\plugins\\it.eng.test.ds.consumer_1.0.0.201401071018.jar");
                    consumerBundle.start();
                    if(consumerBundle.getState()== consumerBundle.ACTIVE)
                        System.out.println("Consumer Bundle is Active!");


                    System.out.println("done!");


                } catch (BundleException e) {

                    e.printStackTrace();

                    System.out.println("Not done!");
                }





                shutdownApplication();


    }

    public Bundle[] getInstalledBundles()
    {
        // Use the system bundle activator to gain external
        // access to the set of installed bundles.
        return m_activator.getBundles();
    }

    public void shutdownApplication()
    {
        // Shut down the felix framework when stopping the
        // host application.
        try {
            m_felix.stop();
        } catch (BundleException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            m_felix.waitForStop(0);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

现在我收到以下错误:

ERROR: it.eng.test.ds.consumer (2): Component descriptor entry 'OSGI-INF/consumer.xml' not found. 

我想我的捆绑包有问题,但它非常简单,正如我在上面描述的那样。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我已经重播了你的设置,我已经让它工作了。

(如果所有其他方法都失败,则github仓库为here

检查OSGI-INF /是否实际在您的捆绑包中,是否将其添加到build.properties(如果您使用PDE)

问候,弗兰克

答案 1 :(得分:0)

我不确定你的确切意图是什么,但是将osgi bundle嵌入到标准的java应用程序中可能不是最好的选择。我建议将您的应用程序转换为osgi(如果可能的话,它不会太大)。如果您不能这样做,请考虑使用ds组件模拟包,例如只需手动创建组件实例并立即设置它的依赖项。但不要混淆两个世界。