我正在尝试启动我的一个捆绑包,但是一旦启动它,我就会得到以下异常.我不确定问题是什么.
org.osgi.framework.BundleException: Unresolved constraint in bundle GoldeneyeModellingFramework [1]: Unable to resolve 1.0: missing requirement [1.0] osgi.wiring.package; (&(osgi.wiring.package=com.host.domain.sharedpersonalize.storageservice)(version>=1.0.0)(!(version>=2.0.0)))
at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
at com.host.personalize.bullseye.InitializeOSGiFramework.installAndStartBundle(InitializeOSGiFramework.java:217)
at com.host.personalize.bullseye.InitializeOSGiFramework.getBundlesInformation(InitializeOSGiFramework.java:167)
at com.host.personalize.bullseye.InitializeOSGiFramework$1.run(InitializeOSGiFramework.java:92)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:452)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:328)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:161)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:109)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:192)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:216)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:897)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919)
at java.lang.Thread.run(Thread.java:736)
Run Code Online (Sandbox Code Playgroud)
让我告诉你我是怎么做的 - 我已经按照本教程推出了一个OSGi框架,它工作正常,但是一旦我开始捆绑,GoldeneyeModellingFramework-
for (Bundle bundle : installedBundles) {
bundle.start();
}
Run Code Online (Sandbox Code Playgroud)
而且,我在我的主项目中使用下面的依赖项,它启动了一个OSGi框架/容器:
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.framework</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>org.ops4j.pax.url</groupId>
<artifactId>pax-url-mvn</artifactId>
<version>1.3.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
它总是给我上面的例外.Bundle GoldeneyeModellingFramework取决于GoldeneyeStorageService包含此包的maven项目com.host.domain.sharedpersonalize.storageservice. …
我需要在我正在Eclipse中开发的OSGi包中嵌入第三方JAR文件.我做了很多搜索和阅读,我一遍又一遍地看到同样的事情:
Bundle-ClassPath: ., jar_filename.jar在清单中指定.好的.除了JAR我嵌入很小,不太可能被我在这个封闭系统上实现的任何其他东西使用,因此嵌入它要容易得多,因此用户只需下载一个捆绑包(易于使用) - 用户至关重要).所以我要反对惯例并嵌入它.
现在,在IDE中,一切都是犹太洁食.我把JAR放在src我的Eclipse项目的文件夹中并配置了项目的构建路径,使用"add jar"按钮(不是"添加外部jar",因为我导致相信将使用绝对路径)包含它"配置构建路径"对话框.我还在Bundle-ClassPath我的清单文件中添加了该行.在IDE中,我的所有导入都解析得很好(因为它在构建路径中),但是当我将它作为一个包(默认选项)导出时,错误日志显示导入无法解析.
我检查了生成的最终bundle JAR文件,并且第三方JAR按预期嵌套在(在根目录下),但是一旦它尝试从该库导入对象,它就会失败.
下面是我的(非常基本的)MANIFEST.MF.我错过了什么吗?除了将它列在bundle-classpath之外,我是否需要将其列为import-package?我需要导出它(为什么?)?我错误地使用了bundle-classpath吗?我是否需要做一些不同的事情,因为我正在使用Eclipse?
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ZWave Demo
Bundle-SymbolicName: com.wbarlow.zwavedemo
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.wbarlow.zwavedemo.internal.Activator
Bundle-Vendor: WBARLOW
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-ClassPath: .,
rxtx-2.1.7.jar
Run Code Online (Sandbox Code Playgroud)
编辑:我通过使用GUI重新完成所有操作来解决这个问题,而不是直接编辑.MF文件.我猜Eclipse会在你这样做时设置一些背景配置.
我们同时使用spring-web,并spring-websocket在我们的RCP应用程序,它们都通过转换成捆P2-Maven的插件.下面是我们的应用程序的MANIFEST.MF文件.
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Todo
Bundle-SymbolicName: com.example.e4.rcp.todo;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: EXAMPLE
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.apache.commons.logging;bundle-version="1.2.0",
org.springframework.spring-aop;bundle-version="4.3.3",
org.springframework.spring-beans;bundle-version="4.3.3",
org.springframework.spring-context;bundle-version="4.3.3",
org.springframework.spring-core;bundle-version="4.3.3",
org.springframework.spring-expression;bundle-version="4.3.3",
org.springframework.spring-web;bundle-version="4.3.3",
org.eclipse.e4.ui.css.swt;bundle-version="0.12.0",
org.eclipse.e4.ui.css.swt.theme;bundle-version="0.10.0",
org.eclipse.e4.ui.workbench.addons.swt;bundle-version="1.2.0",
org.eclipse.e4.ui.workbench.renderers.swt;bundle-version="0.13.0",
org.eclipse.e4.ui.workbench.swt;bundle-version="0.13.0",
org.eclipse.swt;bundle-version="3.104.1",
org.eclipse.e4.ui.di;bundle-version="1.1.0",
org.eclipse.e4.core.services;bundle-version="2.0.100",
org.eclipse.osgi.services;bundle-version="3.5.100",
org.eclipse.e4.core.di.annotations;bundle-version="1.5.0",
org.springframework.spring-websocket;bundle-version="4.3.2",
org.springframework.spring-messaging;bundle-version="4.3.2",
javax.inject;bundle-version="1.0.0",
javax.annotation;bundle-version="1.2.0",
org.apache.tomcat.embed.tomcat-embed-core;bundle-version="8.5.4",
org.apache.tomcat.embed.tomcat-embed-websocket;bundle-version="8.5.4"
Run Code Online (Sandbox Code Playgroud)
当我启动应用程序时,它会弹出以下错误:
!SESSION 2016-11-10 09:48:03.750 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.8.0_101
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US
Framework arguments: -product com.example.e4.rcp.todo.product clearPersistedState
Command-line arguments: -product com.example.e4.rcp.todo.product -data > :\Users\wangzen\Console_prototype/../runtime-todo.product -dev > ile:C:/Users/wangzen/Console_prototype/.metadata/.plugins/org.eclipse.pde.core/to> o.product/dev.properties -os win32 …Run Code Online (Sandbox Code Playgroud) 我已经使用 Java17 运行了 OSGi 捆绑包,并在启动时得到了以下结果。Java 17 还不支持 OSGi 吗?
org.osgi.util.tracker.ServiceTracker.getServices()”为空
我需要xlsx在OSGi包中处理Excel文档,但org.apache.servicemix.bundles.poi缺少使用2007和旧格式的类.
我已经创建了一个带有完整apache poi的OSGi包(jar文件)(包括ooxml官方apache poi包中没有的类).我用过这个pom.
所以,经过一些努力,我有我想要的捆绑.现在的问题是如何将它与我现有的捆绑包一起使用?我怎么能告诉它导入我需要的东西?从理论上讲,这个pom文件<servicemix.osgi.export>列出了要导出的命名空间,我应该可以在我的包中导入它们.
我有一个相当复杂的 OSGi 应用程序,它使用声明式服务,并且设计为部署在 Equinox 中。现在的任务是使该应用程序可以部署在 WAS 8 中。
第一次尝试非常务实:我部署了一个 EAR,它的启动基本上与 Equinox 相同,经过一些 WAS 类加载策略调整后,它已经起作用了。
现在我想更进一步:摆脱 Equinox 运行时并在 WAS 8 中“本地”部署我的捆绑包。因此,我编写了一个 EBA,其中包含我的业务捆绑包、它们的依赖项和 Equinox DS 运行时。EBA 作为资产部署并集成到 BLA 中。应用程序甚至已启动并运行,但组件尚未初始化。
要点是,必须在自己的业务包之前启动 equinox.ds(更新:不是必须的,下面讨论)才能使 DS 完成其工作。但是我如何告诉捆绑包在已部署的 EBA 中首先启动哪个捆绑包呢?我需要 Equinox 的 config.ini 文件的一些模拟。
我知道我可以使用本机支持的蓝图重新连接我的组件,但坦率地说,这是我最不想做的事情。应该可以让 Equinox DS 工作,不是吗?
另一个问题是:如何为自己部署在 WAS 8 下的应用程序获取 OSGi 控制台?我想控制我的捆绑包,但似乎无法从管理控制台做到这一点。
更新
感谢 BJ 和 Neil(下面的讨论),问题归结为“如何在 WAS 8.0 中部署的我自己的 OSGi 应用程序中启动特定的包?”
我正在尝试设置我的eclipse插件开发目标并多次收到以下错误:
!ENTRY org.eclipse.e4.ui.css.swt 4 0 2015-01-30 15:15:06.879
!MESSAGE FrameworkEvent ERROR
!STACK 0
org.osgi.framework.BundleException: Could not resolve module: org.eclipse.e4.ui.css.swt [955]
Unresolved requirement: Require-Bundle: org.eclipse.e4.ui.css.core; bundle-version="0.9.0"
-> Bundle-SymbolicName: org.eclipse.e4.ui.css.core; bundle-version="0.10.100.v20140424-2042"; singleton:="true"
org.eclipse.e4.ui.css.core [1134]
Unresolved requirement: Require-Bundle: org.apache.batik.css; bundle-version="1.7.0"
-> Bundle-SymbolicName: org.apache.batik.css; bundle-version="1.7.0.v201011041433"
org.apache.batik.css [1177]
Unresolved requirement: Import-Package: org.w3c.dom.events; version="[3.0.0,4.0.0)"
Run Code Online (Sandbox Code Playgroud)
这是否意味着这些插件都无法解析,或者只是不是最后一个插件,或者org.w3c.dom.events这是由于捆绑版本的不匹配造成的org.eclipse.e4.ui.css.core?
我想为Raspberry Pi 的 GPIO编写一个OSGI 捆绑包(Eclipse SmartHome 绑定)。
对于 GPIO,我需要包含 Pi4J 库。我将它们添加到我的项目文件夹中的 lib 文件夹中,并将 pi4j-core.jar 添加到我的构建路径中。
这是我的代码:
/**
* Copyright (c) 2014 openHAB UG (haftungsbeschraenkt) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.statusgpio.handler;
import static org.openhab.binding.statusgpio.StatusGPIOBindingConstants.*;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import org.eclipse.smarthome.core.library.types.StringType;
import org.eclipse.smarthome.core.thing.ChannelUID;
import org.eclipse.smarthome.core.thing.Thing;
import org.eclipse.smarthome.core.thing.binding.BaseThingHandler; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Spring Boot 2.1.4 和 Java 8、OSGi 版本 5.0.0 和 Apache Karaf 4.1.3 构建 OSGi Karaf 应用程序。
我在 GitHub 中创建了以下项目,当我使用 Spring Boot 1.5.9 时,该项目构建并运行良好。
但是当我将 Spring boot 版本从 1.5.9-RELEASE 更改为 2.1.4-RELEASE 并尝试执行此操作mvn clean install时,我从 maven-bundle-plugin 收到以下错误
[WARNING] Bundle com.nemesis:osgi-spring-boot-demo-bundle:bundle:0.0.1-SNAPSHOT : Export com.nemesis.osgi.springboot, has 4, private references [com.nemesis.osgi.springboot.controller, org.springframework.context.annotation, org.springframework.boot, org.springframework.boot.autoconfigure],
[ERROR] Bundle com.nemesis:osgi-spring-boot-demo-bundle:bundle:0.0.1-SNAPSHOT : Exception: java.lang.ArrayIndexOutOfBoundsException: 19
[ERROR] Bundle com.nemesis:osgi-spring-boot-demo-bundle:bundle:0.0.1-SNAPSHOT : Invalid class file META-INF/versions/9/module-info.class (java.lang.ArrayIndexOutOfBoundsException: 19)
[ERROR] Bundle com.nemesis:osgi-spring-boot-demo-bundle:bundle:0.0.1-SNAPSHOT : Classes found in the wrong directory: …Run Code Online (Sandbox Code Playgroud) osgi apache-karaf maven-bundle-plugin osgi-bundle spring-boot
有没有办法将 OSGI 包用作 maven 依赖项,而无需将所有包从中获取到它甚至不导出的类路径中?
问题背景:我们刚刚将org.apache.sling.xss包作为 maven 依赖项添加到我们的项目中。正如您在 pom.xml 中看到的,它只是导出包 org.apache.sling.xss 但将各种依赖项作为Private-Package直接嵌入到它的jar中。虽然 OSGI 对其他包隐藏了这些东西,但 maven 没有。所以我们得到了冲突:org.apache.sling.xss 嵌入了例如commons-beanutils 的1.7.0 版本,它与我们一直使用的commons-beanutils 的新版本不兼容,所以我们现在得到编译错误。
有没有什么好的解决方案 - 从我们的角度来看,从 org.apache.sling.xss 包的维护者的角度来看?理想情况下,如果您使用该包,您只会将导出的 org.apache.sling.xss 包放入类路径中。所以也许一个好的解决方案是 org.apache.sling.xss 提供一个单独的 API jar,只包含那个类?有没有标准的方法来做到这一点,或者其他解决方案?我们可以以某种方式告诉 maven 只将该包包含在类路径中吗?(我知道 maven 有依赖排除,但这在这里没有帮助,因为有问题的东西不是 sling.xss 的传递依赖,而是实际上包含在 org.apache.sling.xss jar 中。)
osgi-bundle ×10
osgi ×8
java ×6
eclipse ×2
apache-felix ×1
apache-karaf ×1
eclipse-jdt ×1
equinox ×1
java-17 ×1
maven ×1
openhab ×1
openxml ×1
rcp ×1
sling ×1
spring-boot ×1
websphere-8 ×1