【问题标题】:How do I configure an OSGi environment so that it is possible to use it from the EclipseStarter class?如何配置 OSGi 环境以便可以从 EclipseStarter 类中使用它?
【发布时间】:2009-06-03 07:58:02
【问题描述】:

目前我正在尝试使用 EclipseStarter 类的功能来执行一些包。如果我直接从 Eclipse 运行我的程序,则会加载 OSGi 服务包,并且我可以安装和启动其他包。

但是,如果我将我的 java 程序导出到一个可执行的 jar 文件并从命令行运行它,那么环境会加载一个名为“System Bundle [0]”的包,而不是 OSGi 服务包。每次尝试安装新包都会导致 Nullpointer-Exception。

我是否必须在框架属性中设置一些特殊配置才能使用 jar 文件中的 OSGi 环境?目前我只设置以下两个值:

frameworkProperties.put("osgi.clean", "true");
frameworkProperties.put("osgi.console", "true");

更新:

我认为我的问题可能与使用的 java 类路径有关。如果我像这样将 Framework-Bundle 添加到类路径中

java -classpath /home/markus/org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar:test.jar 
Starter.Starter

一切正常:

osgi> ss

Framework is launched.

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.4.3.R34x_v20081215-1030

但如果我只运行 jar 文件,我会收到以下错误日志:

markus@markus-laptop:~/configuration$ cat 1244201504478.log
!SESSION 2009-06-05 13:31:44.895 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.6.0_13
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=de_DE
Command-line arguments:  -clean -console

!ENTRY org.eclipse.osgi 4 0 2009-06-05 13:31:44.897
!MESSAGE An unexpected runtime error has occurred.
!STACK 0
java.lang.NullPointerException
        at org.eclipse.osgi.internal.baseadaptor.BaseStorage.readStateData(BaseStorage.java:743)
        at org.eclipse.osgi.internal.baseadaptor.BaseStorage.getStateManager(BaseStorage.java:698)
        at org.eclipse.osgi.baseadaptor.BaseAdaptor.getState(BaseAdaptor.java:390)
        at org.eclipse.core.runtime.adaptor.EclipseStarter$1.bundleChanged(EclipseStarter.java:307)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:1234)
        at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:211)
        at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:141)
        at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1518)
        at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1469)
        at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:281)
        at org.eclipse.osgi.framework.internal.core.StartLevelManager.launch(StartLevelManager.java:247)
        at org.eclipse.osgi.framework.internal.core.SystemBundle.resume(SystemBundle.java:201)
        at org.eclipse.osgi.framework.internal.core.Framework.launch(Framework.java:644)
        at org.eclipse.osgi.framework.internal.core.OSGi.launch(OSGi.java:51)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:313)
        at CanEmulator.OSGiFramework.run(OSGiFramework.java:119)
        at java.lang.Thread.run(Thread.java:619)

!ENTRY System Bundle 4 0 2009-06-05 13:31:44.898
!MESSAGE
!STACK 0
java.lang.NullPointerException
        at org.eclipse.osgi.internal.baseadaptor.BaseStorage.readStateData(BaseStorage.java:743)
        at org.eclipse.osgi.internal.baseadaptor.BaseStorage.getStateManager(BaseStorage.java:698)
        at org.eclipse.osgi.baseadaptor.BaseAdaptor.getState(BaseAdaptor.java:390)
        at org.eclipse.core.runtime.adaptor.EclipseStarter$1.bundleChanged(EclipseStarter.java:307)
        at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:1234)
        at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:211)
        at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:141)
        at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1518)
        at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1469)
        at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:281)
        at org.eclipse.osgi.framework.internal.core.StartLevelManager.launch(StartLevelManager.java:247)
        at org.eclipse.osgi.framework.internal.core.SystemBundle.resume(SystemBundle.java:201)
        at org.eclipse.osgi.framework.internal.core.Framework.launch(Framework.java:644)
        at org.eclipse.osgi.framework.internal.core.OSGi.launch(OSGi.java:51)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:313)
        at CanEmulator.OSGiFramework.run(OSGiFramework.java:119)
        at java.lang.Thread.run(Thread.java:619)

目前我在我的 Eclipse 项目中使用 framework-jar-file 作为外部库。我认为当我将项目导出到可执行文件时出现问题...

BR,

马库斯

【问题讨论】:

  • 您是否在应用程序中嵌入了 OSGi 框架?或者它只是一个旨在在另一个框架实例中运行的包?您使用的是哪个 OSGi 框架?
  • 我正在使用最新的 Equinox OSGi 框架:org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar

标签: java configuration command-line osgi executable-jar


【解决方案1】:

我还会添加以下属性

osgi.noShutdown=true

osgi.configuration.area= (path)
osgi.baseConfiguration.area= (path)
osgi.sharedConfiguration.area= (path)
osgi.instance.area= (path)
osgi.user.area= (path)

第一个告诉 Equinox 不要停止。如果您不创建 Eclipse 应用程序,这是必要的。其他的是各种文件应该去的路径。当您想使用控制台时,只需这样做

osgi.console=

不需要值。如果你输入一个数字,那将是一个可以看到控制台的 telnet 端口。

现在,对于您的捆绑包,您将始终看到系统捆绑包。那就是 OSGi 本身。要添加其他捆绑包,您需要安装它们。您可以通过控制台安装它们,或者通过配置使用:

osgi.bundles= (comman delim list of bundle paths)

您可以使用 System Bundle 实例以编程方式安装捆绑包,该实例可以从 EclipseStarter 获得。

如果这些不起作用,您能否上传堆栈跟踪或 osgi 日志文件(您可能会在工作目录或“osgi.configuration.area”中找到 osgi 日志文件)。这将是一个名称纯数字的文件。

【讨论】:

  • 嗨!添加这些参数后,框架根本没有启动。如果我现在从 jar 文件运行它,我会得到 java.lang.NullPointerException。因此没有osgi日志文件。
猜你喜欢
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2022-01-18
  • 1970-01-01
  • 2016-04-26
相关资源
最近更新 更多