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

Karaf功能安装缺少osgi的要求。服务,但它在那里

阎麒
2023-03-14

我有一个将数据源导出为OSGi服务的数据源功能:

> services -p 2038
OPS4J Pax JDBC Config (2038) provides:
--------------------------------------
objectClass = [org.osgi.service.cm.ManagedServiceFactory]
service.bundleid = 2038
service.id = 211
service.pid = org.ops4j.datasource
service.scope = singleton
----
databaseName = foobar
dataSourceName = fooDatasource
felix.fileinstall.filename = file:/home/foousr/apache-karaf-4.0.6/etc/org.ops4j.datasource-foo.cfg
objectClass = [javax.sql.DataSource]
osgi.jndi.service.name = fooDatasource
service.bundleid = 2038
service.factoryPid = org.ops4j.datasource
service.id = 251
service.pid = org.ops4j.datasource.b3020619-71b9-4876-94c3-477f3e4a503d
service.scope = singleton
url = jdbc:oracle:thin:@dbserver:99999/foo
user = FOOUSR

作为创建和注册此数据源服务的ds功能的一部分,它还包含一个ping ds捆绑包,我可以使用它来测试数据源:

> jdbc:ping-ds fooDatasource
Ping from localhost(127.0.0.1) as FOOUSR to schema FOOUSR on dbserver/foo

我有一个使用该数据源的蓝图包:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
  xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/blueprint"
    xsi:schemaLocation="
       http://www.osgi.org/xmlns/blueprint/v1.0.0
       http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint
       http://camel.apache.org/schema/blueprint/camel-blueprint.xsd
       http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0
       http://svn.apache.org/repos/asf/aries/trunk/blueprint/blueprint-cm/src/main/resources/org/apache/aries/blueprint/compendium/cm/blueprint-cm-1.1.0.xsd">
    <reference id="ds" interface="javax.sql.DataSource" filter="(dataSourceName=fooDatasource)"/>
    <camelContext id="fooDatasourceTestContext" trace="true" xmlns="http://camel.apache.org/schema/blueprint">
        <route id="fooDatasourceTest">
            <from uri="timer:/fooDatasourceTest?fixedRate=true&amp;repeatCount=1"/>
            <setBody>
                <simple>
                    select * from FOOUSR.FOOTABLE
                </simple>
            </setBody>
            <to uri="jdbc:ds" />
            <to uri="log:fooDatasourceTest?showBody=true"/>
        </route>
    </camelContext>
</blueprint>

当我执行<code>功能:安装foo datasource测试功能

    Error executing command: Unable to resolve root: missing requirement [root] osgi.identity;
 osgi.identity=foo-datasource-test-feature; type=karaf.feature; version="[0.0.1.SNAPSHOT,0.0.1.SNAPSHOT]";
 filter:="(&(osgi.identity=foo-datasource-test-feature)(type=karaf.feature)(version>=0.0.1.SNAPSHOT)(version<=0.0.1.SNAPSHOT))"
 [caused by: Unable to resolve foo-datasource-test-feature/0.0.1.SNAPSHOT: missing requirement
 [foo-datasource-test-feature/0.0.1.SNAPSHOT] osgi.identity; osgi.identity=com.company.project.foo-datasource-test;
 type=osgi.bundle; version="[0.0.1.SNAPSHOT,0.0.1.SNAPSHOT]"; resolution:=mandatory [caused by: Unable to resolve
 com.company.project.foo-datasource-test/0.0.1.SNAPSHOT: missing requirement
 [com.company.project.foo-datasource-test/0.0.1.SNAPSHOT] osgi.service; effective:=active;
 filter:="(&(objectClass=javax.sql.DataSource)(dataSourceName=fooDatasource))"]]

它似乎在抱怨它找不到已安装的OSGi服务的数据源:

osgi.service; effective:=active;
 filter:="(&(objectClass=javax.sql.DataSource)(dataSourceName=fooDatasource))"]]

奇怪的是,除了我编写的ping ds命令工作正常之外,如果我只安装了它抱怨的特性中的测试包,它工作正常。这意味着这是功能的某种问题:安装进程本身。

在foo数据源测试特性中,我包括一个引用ds特性的foo核心特性:

foo-datasource-test-feature.xml:

<?xml version="1.0" encoding="utf-8"?>
<features name="foo-datasource-test" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0">
    <feature name="foo-datasource-test-feature" version="${project.version}">
        <feature>foo-core-feature</feature>
        <bundle>mvn:com.company.project/foo-datasource-test/${project.version}</bundle>
    </feature>
</features

foo-core-feature.xml:

<?xml version="1.0" encoding="utf-8"?>
<features name="foo-core" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0">
    <feature name="foo-core-feature" version="${project.version}">
        <feature>ds-feature</feature>
        ...
    </feature>
</features>

ds-features.xml:

<?xml version="1.0" encoding="UTF-8"?>
<features name="ds-features" xmlns="http://karaf.apache.org/xmlns/features/v1.0.0">
    <feature name="ds-feature" version="${project.version}" >
        <feature>pax-jdbc-config</feature>
        ...
        <bundle start-level="86">mvn:com.company.commons/foo-datasource/${project.version}</bundle>
    </feature>
    <feature name="ds-ping-datasource" version="${project.version}" >
        <bundle start-level="80">mvn:com.company.commons/foo-ping-datasource/${project.version}</bundle>
        <feature>pax-jdbc-config</feature>
    </feature>
</features>

这会导致问题吗?如果是这样,因为foo-datasource-test-特性依赖于已经安装的数据源服务,那么在我的特性中描述这种依赖关系的正确方法是什么?

使用:

卡拉夫 版本 4.0.6

骆驼版2.16.5

更新

我注释掉了对核心特性的引用,这样只有捆绑包在测试特性中,它仍然会抱怨。所以这与特性对特性的依赖无关。

我将尝试karaf 4.1.0版。

更新

4.1.0没有乐趣。顺便说一句,由于Activeemq-Client 5.14.4尚未构建,因此问题更多。

共有1个答案

喻高寒
2023-03-14

显然,feature:install不是在OSGi服务注册表中查找服务,而是在其他地方的清单中查找服务。一位同事让我查看清单文件,我在foo datasource测试中注意到它的清单文件中有一个导入服务头:

Import-Service: javax.sql.DataSource;multiple:=false;filter=(dataSourceName=fooDatasource)

看起来这个错误是因为它正在做我的清单文件要求它做的事情,即导入服务。我不知道为什么它在OSGi服务注册表中找不到它。但在任何清单文件中都没有相应的导出服务。但是,由于导入服务和导出服务显然已被弃用,而且我正在迁移到karaf的fuse上运行的旧代码也没有得到通知;-)我决定简单地找到一种方法来删除任何导入或导出服务头。

按照这个建议,我补充道

<_removeheaders>Import-Service,Export-Service</_removeheaders>

到我的foo-core-feature pom.xml中maven-bundle-plugin的指令部分(回想一下,foo-datasource-test-feature依赖于foo-core-feature):

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>3.2.0</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                    . . .
                        <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
                        <Import-Package>*,org.apache.camel.core.osgi</Import-Package>
                        <_removeheaders>Import-Service,Export-Service</_removeheaders>
                    </instructions>
                </configuration>
            </plugin>
        <plugins>
</build>

在<code>mvn clean deploy

像往常一样,在寻找了很长一段时间后,它是简单或基本的东西。我不确定为什么功能:install无论如何都不会只检查OSGi注册表,但它不依赖它并寻找MANIFEST标头可能有一个很好的理由(我希望)。不确定Provit-Capable标头在这种情况下是否运行得更好,但可能会尝试一下。

 类似资料:
  • 问题内容: 下载elasticsearch并按照此链接中的步骤解压缩后: 在Windows上安装Elastic Search 我收到以下错误: 注意:我还必须按照此决议的建议安装JDK8 我应该更改.config文件中的内容吗?也许这条线? 问题答案: 将环境变量设置为指向 JDK 8 安装路径。 您可以在命令行上执行此操作,如以下示例所示: 使用以下命令确认您使用的是正确的JDK版本:

  • 我写了一个包含5个模块的项目。我用maven在intellij IDEA中创建它们,然后为所有模块添加“OSGi”框架支持。我使用maven-bundle-plugin来配置导出包和导入包。但是当我运行它的时候,总是有一个错误: 启动器模块包含Bundle-Activator,org.gxkl.server包在服务模块中。我使用类似的pom来配置模块,但是只有服务模块出错。启动器中的pom文件如下

  • 问题内容: 我无法在Karaf(版本3.0.1)中启动捆绑包。 该捆绑包使用maven构建,并导入gson。 我根据需要将gson包括在maven中: 构建顺利。但是,在部署捆绑软件时,我从Karaf收到此警告: 未安装捆绑软件。 在中开头: 我尝试使用以下方法进行更改: 但这给了我一个类似的错误: 的: 在谷歌GSON(版本Maven同时下载时,我建的软件包)是: 我也尝试过 现在已嵌入依赖项,

  • 我无法在 Karaf(版本 3.0.1)中启动捆绑包。 该捆绑包使用maven构建,并导入gson。 我根据需要将gson包含在maven中: 构建运行良好。但是,在部署捆绑包时,我收到了来自Karaf的警告: 捆绑包未安装。 中的导入包开头为: 我试图改变它: 但它给了我一个类似的错误: pom.xml代码: (我构建捆绑包时maven下载的版本)是: 我也试过 现在依赖项已经嵌入,但是Kara

  • 这是一个简单的(v1.4.0),我所做的只是指定 因此错误: 执行命令时出错:无法解析根:缺少需求[root]osgi。身份奥斯基。身份=我的特征;类型=卡拉夫。特色version=“[2.0.0,2.0.0]”;过滤器:=”( 我的印象是,在一个特性中指定我的捆绑包并进行安装会将它们全部拉到karaf中。 我该如何解决这个问题?

  • 问题内容: 我是OSGI的新手,我试图找出解决以下错误的方法 org.osgi.framework.BundleException:包org.foo.serviceBundle中未解决的约束[253]:无法解决253.0:缺少要求[253.0]包;未解决。(&(package = org.slf4j)(版本> = 1.6.0)(!(版本> = 2.0.0))) 我使用了Maven原型来生成包,并在