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

为什么我的OSGI示例无法在捆绑包开始时打印“Hello World”?

徐翔
2023-03-14

把一个例子从尼尔·巴特利特OSGi的书”

package tutorial;
import java.io.File;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;

public class HelloUpdaterActivator implements BundleActivator {
// ...
private final Thread thread = new Thread(new BundleUpdater());
private volatile BundleContext context;

@Override
public void start(BundleContext context) throws Exception {
    System.out.println("Hello World");
    this.context = context;
    thread.start();
}

@Override
public void stop(BundleContext context) throws Exception {
    System.out.println("Goodbye World");
    thread.interrupt();
}

protected Bundle findBundleByLocation(String location) {
    // ... Not relevant to lack of any print statements in OSGi console.
}

private class BundleUpdater implements Runnable {
    @Override
    public void run() {
        // ... Not relevant to lack of any print statements in OSGi console.
    }
}

^我把它放在一个文件叫做HelloUpdaterActivator。

我成功地编译java文件教程智慧

javac -cp ".:org.eclipse.osgi_3.5.1.R35x_v20090827.jar" HelloUpdaterActivator.java

然后我把所有生成的类文件

jar cf HelloUpdaterActivator.jar ./HelloUpdaterActivator.class ./HelloUpdaterActivator\$BundleUpdater.class ./HelloUpdaterActivator\$1.class

最后,我做了一个通用的样品清单。MF文件

Manifest-Version: 1.0
Created-By: 1.7.0_79 (Oracle Corporation)
Bundle−Name: OSGi Bundle
Bundle−Symbolic Name: example1
Bundle−Version: 1.0.1
Bundle−Required Execution Environment: J2SE−1.6

现在jar已经准备好了,我在终端中打开了OSGi,它有自己的小控制台,就像这样:

java -jar ./org.esgi_3.5.1.R35x_v20090827.jar -console -configuration runtime

OSGi 控制台如下所示:

osgi> 

我在OSGi控制台中输入:

osgi> install file:HelloUpdaterActivator.jar
Bundle id is 1
osgi> ss

Framework is launched.

id  State       Bundle
0   ACTIVE      org.eclipse.osgi_3.5.1.R35x_v20090827
1   INSTALLED   unknown_0.0.0 [1]

osgi> start 1
osgi> ss

Framework is launched.

id  State       Bundle
0   ACTIVE      org.eclipse.osgi_3.5.1.R35x_v20090827
1   ACTIVE      unknown_0.0.0 [1]

osgi> stop 1

osgi> ss

Framework is launched.

id  State       Bundle
0   ACTIVE      org.eclipse.osgi_3.5.1.R35x_v20090827
1   RESOLVED    unknown_0.0.0 [1]

但是即使它说我创建的jar文件是活动的,“Hello World”永远不会在开始时打印,“Goodbye World”永远不会在停止时打印。为什么我的OSGi教程不会在包开始时打印“Hello World”或在包停止时打印“Goodbye world ”?

更新

我明白了通过改变我的工作清单。MF文件t

Manifest-Version: 1.0  
Bundle-ManifestVersion: 2
Bundle-Name: OSGi_Bundle - Activator  
Bundle-Version: 1.0.0.SNAPSHOT
Bundle-Activator: Activator  
Bundle-ClassPath: .
Bundle-Description: Activator
Bundle-SymbolicName: activator
Import-Package: org.osgi.framework

共有1个答案

拓拔高畅
2023-03-14

您缺少了一个<code>Bundle Activator</code>头,因此它知道如何调用该类的方法。

 类似资料:
  • 我正在开发超文本传输协议客户端应用程序作为一个OSGI捆绑项目,我已经使用apache maven创建项目文件夹结构使用下面的命令。 上面的命令创建了项目文件夹结构,因为我使用的是基于httpclient的应用程序。我在pom中添加了依赖项。xml如下所示。 我执行以下命令, 根项目上进行构建 它在本地maven存储库中创建了所需的jar文件。 问题从这里开始。我试图在ApacheServiceM

  • 我已经用声明性服务(DS)组件定义定义了一个OSGi包(),指定了一个导出的服务、一个激活方法和一个停用方法。 在Activate方法的主体中,我需要访问一个文件,该文件不在文件系统中,但绑定在OSGi捆绑包中。在activate方法期间,使用。 这基本上是可行的,但有一种情况是不可行的。在我的应用程序中,

  • 我还不是一个有经验的OSGi用户,因此我会遇到一些问题。 我正在尝试使用作为外部提供程序,因为我不希望我的包包含所有这些类。 但是,当我运行这组包(my和)时,我得到以下错误: 错误:Bundle org.apache.serviceMix.bundles.hadoop-client[56]错误启动文件:bundles/org.apache.serviceMix.bundles.hadoop-cl

  • 问题内容: 如何定义OSGi捆绑包的开始级别? 我正在使用Apache felix,并希望在框架执行过程中保持起始级别。我预计Manifest中的条目根本不需要非常频繁地更改bundle的开始级别。MF似乎是最明智的。我已经到org.osgi.framework.startlevel了,但是还没有看到实际的例子。 如果有一种巧妙的方法将起始级别并入POM,那么我也将maven与maven-bund

  • 我有两个捆绑说A和B。A 依赖于 B(在 A 的 MANIFEST 中指定为 Required-Bundle:B)。 现在我安装两个A, B包一个接一个(c 我从异常中了解到捆绑包B尚未启动(已解决)。现在如何解决这个问题呢? 解决这个问题的唯一方法是排序包 顺便说一下,我用的是春分。

  • 问题内容: 在我的AEM项目的代码中看似无关紧要的更改之后,我的捆绑软件无法解决。检查日志后,我可以看到出现以下错误。 该项目在本地编译得很好,并且只有在容器尝试解决该捆绑包后,该问题才会出现。 我没有在任何更改中添加任何显式依赖项。项目对象模型与以前相同。顾名思义,这是一个核心Java软件包,因此我希望它会被System软件包公开。 我正在运行AEM支持的JDK 7,所以不要指望它与JVM兼容性