Installation Karaf功能安装缺少osgi.service要求,但它在那里

Installation Karaf功能安装缺少osgi.service要求,但它在那里,installation,karaf,Installation,Karaf,我有一个数据源功能,可以将数据源导出为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.

我有一个数据源功能,可以将数据源导出为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>
我有一个使用该数据源的蓝图包:

> 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>
它似乎在抱怨找不到已安装的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
<?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>

foo核心特性
mvn:com.company.project/foo数据源测试/${project.version}

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

Import-Service: javax.sql.DataSource;multiple:=false;filter=(dataSourceName=fooDatasource)
错误似乎是因为它正在执行清单文件要求它执行的操作,即导入服务。我不知道为什么它在OSGi服务注册表中找不到它。但在任何清单文件中都没有相应的导出服务。但是,由于导入服务和导出服务显然已被弃用,而且我正在迁移到karaf的fuse上运行的旧代码也没有得到通知;-)我决定简单地找到一种方法来删除任何导入或导出服务头

接下来,我补充道

<_removeheaders>Import-Service,Export-Service</_removeheaders>
导入服务,导出服务
进入my foo core feature pom.xml中maven bundle插件的说明部分(回想一下foo datasource测试特性依赖于foo core特性):


org.apache.felix
maven捆绑插件
3.2.0
真的
. . .
${project.groupId}.${project.artifactId}
*,org.apache.camel.core.osgi
进口服务
mvn clean deploy
之后,
功能:install
运行正常(找到数据源,使用它并返回sql结果集)


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

activemq客户端修复程序是今天为5.14.4构建的(),因此我切换回使用karaf 4.1.0,并使用以下版本:activemq.version=5.14.4 camel.version=2.18.2 spring.version=4.3.5.release我刚刚遇到同样的问题,仅使用在具有持久性单元的捆绑包中自动生成的Require-Capability头。有趣的是,它已经起作用了,然后“突然”停止了。可悲的是,卡拉夫语中有很多东西写得很糟糕。
<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>