当前位置: 首页 > 知识库问答 >
问题:

OSGI包已安装并启动,但没有可见的输出

岳允晨
2023-03-14

我正在努力学习OSGI。(主要是束的动态装卸)。

遵循 Neil Bartlett 的 How To Embed OSGi 教程,我将 The Equinox OSGi 框架实现添加到类路径中并启动了游戏。

这是代码:

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.Constants;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.launch.FrameworkFactory;


public class BundleManager {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub

        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);
        framework.start();



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

        installedBundles.add(context.installBundle(
                              "file:C:/Users/student/Documents/eclipse/myPlugins/HellowService.jar"));


        for (Bundle bundle : installedBundles) {

       if (bundle.getHeaders().get(Constants.FRAGMENT_HOST) == null)
                 bundle.start();

         }


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



    }

}

是的,它有效。完全没有错误。但是,我安装的捆绑包是路径中的jar文件:C:/Users/student/Documents/eclipse/myPlugins/HellowService.jar在其启动方法中包含“HelloWorld”。我没有在我的日食控制台中看到“HelloWold”。为什么尽管捆绑包已启动,但我没有看到该消息?我感谢任何简单的帮助。

注意:<代码>HellowService。jar是我之前创建的一个插件项目,在它的一个类中实现了BundleActivator,以在start方法中添加“HelloWorld”消息,最后将其作为jar文件导出到目录C:/Users/student/Documents/eclipse/myPlugins/

编辑:这是我的包我激活器类

package com.javaworld.sample.service.impl;

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

import com.javaworld.sample.service.HelloService;

public class HelloServiceActivator implements BundleActivator {

    ServiceRegistration helloServiceRegistration;


        public void start(BundleContext context) throws Exception {

            HelloServiceFactory helloServiceFactory = new HelloServiceFactory();
            helloServiceRegistration =context.registerService(HelloService.class.getName(), helloServiceFactory, null);

            System.out.println("Hello World!");
        }
        public void stop(BundleContext context) throws Exception {
            helloServiceRegistration.unregister();
        }


}

这是清单。MF文件包:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloService
Bundle-SymbolicName: com.javaworld.sample.HelloService
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.javaworld.sample.service.impl.HelloServiceActivator
Bundle-Vendor: JAVAWORLD
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: org.osgi.framework;version="1.3.0"
Export-Package: com.javaworld.sample.service

我导出包是通过右键单击t

我仍然没有看到“你好,世界!”从我的应用程序启动包时的消息。

共有2个答案

汝和裕
2023-03-14

结果是我错误地导出了包。那是因为我试着自己去做。下面是应该如何将包导出为jar文件:

   Open the plugin export wizard File > Export... > Plug-in Development >
   Deployable plug-ins and fragments . 
   Then select the bundle you want to export and the destination directory. Done!

现在,您可以使用jar文件的路径来安装这个包。对我来说,就是:

 installedBundles.add(context.installBundle(
                              "file:C:/Users/student/Documents/eclipse/myPlugins/plugins/com.javaworld.sample.HelloService_1.0.0.201307220322.jar"));

资料来源:http://help.eclipse.org/juno/index.jsp?topic =/org . eclipse . PDE . doc . user/guide/tools/export _ wizards/export _ plugins . htm

当然要感谢@Neil Bartlett

潘学民
2023-03-14

您的启动器不会等待OSGi框架停止。我希望这个程序能启动所有程序,但随后会立即关闭,因为我们到达了main方法的末尾。请参阅我的教程,其中我展示了如何使用<code>框架。waitForStop方法。

话虽如此,我期望的输出y

 类似资料:
  • 我正在尝试使用构建一个github jquery-ui库,但是在运行之后,我仍然无法根据自述文件运行该命令。它只给出: 我很困惑,请问我错过了什么?

  • 我正在创建一个运行在Eclipse之外的无头OSGI服务器。我使用Jetty作为我的Servlet容器,使用Equinox作为我的OSGI容器。我正在使用包将Jetty添加到OSGi中。如果我从提示符手动启动jetty和org.eclipse.equinox.http.registry,那么它就可以正常运行。但是,我希望这是在无人值守的情况下运行的,所以我需要在OSGi启动时自动(或者至少是编程方

  • 我正在使用RVM,目前我正在使用ruby 2.7.4 我默认安装了bundler-v2.2.26 当我检查宝石的位置时,它不在那里。 当我试图将我的宝石打包到我的项目中时,我遇到了一个错误 我的宝贝呢?发生什么事?

  • 问题内容: 我试图建立一个GitHub的jQuery的UI库使用,但运行后我还是根据无法运行该命令自述文件。它只是给: 我很困惑,我想念什么? 问题答案: 最新版本的Grunt(撰写本文时为0.4)不包含命令行工具,而是您需要单独安装它们。 这是一个好主意,因为这意味着您可以在不同的项目上运行不同版本的Grunt,但是仍然可以使用简洁的命令来运行它们。 因此,首先在全球范围内安装grunt cli

  • 我在CMD中使用命令并成功安装了请求模块,但当我尝试将其导入PyCharm中的文件时,它会抛出 “ModuleNotFoundError:没有名为'requests'的模块 我看到了其他几个关于这个问题的帖子,但没有找到一个可行的解决方案。 作为旁注,我已经在我的Python IDLE中成功运行了这段代码,所以我认为这不是代码问题,只是我的PyCharm设置的问题。

  • 我已经建立了apk和安装后没有图标在启动器。应用程序工作正常,我可以用adb启动活动。但为什么应用程序在启动器中没有图标,我不明白。 似乎我看到了问题的原因。如果我尝试使用adb“adb shell am start mypackagename”启动我的应用程序,我会收到错误: 活动未启动,无法解析Intent{act=android.intent.action.MAIN cat=[android