Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写Maven Bundle插件中需要的功能_Maven_Osgi_Apache Karaf_Bnd_Maven Bundle Plugin - Fatal编程技术网

重写Maven Bundle插件中需要的功能

重写Maven Bundle插件中需要的功能,maven,osgi,apache-karaf,bnd,maven-bundle-plugin,Maven,Osgi,Apache Karaf,Bnd,Maven Bundle Plugin,我的问题类似于,但我使用Maven bundle插件来实现相同的最终结果 我正在构建一个包含persistence.xml文件的捆绑包,我发现maven捆绑包插件在清单中自动生成以下标题: Require-Capability:osgi.service;effective:=active;objectClass=javax.persistence.spi.PersistenceProvider;javax.persistence.provider=org.apache.openjpa.persi

我的问题类似于,但我使用Maven bundle插件来实现相同的最终结果

我正在构建一个包含
persistence.xml
文件的捆绑包,我发现
maven捆绑包插件在清单中自动生成以下标题:

Require-Capability:osgi.service;effective:=active;objectClass=javax.persistence.spi.PersistenceProvider;javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl,
Require-Capability: osgi.extender;osgi.extender=aries.jpa, 
Require-Capability: osgi.service;effective:=active;objectClass=javax.sql.DataSource;filter:="(osgi.jndi.service.name=jdbc/test)"
这本身不是一个问题,但是我正在使用Karaf,我想在我自己的一个功能中部署这个和其他捆绑包以及Karaf功能。当我这样做时,它失败了,因为OSGi无法实现功能
OSGi.service;有效:=有效;objectClass=javax.persistence.spi.PersistenceProvider;javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl
,即使我指定同时安装
openjpa
功能。我发现我可以通过将
effective:=active
更改为
resolution:=optional

为了构建我的捆绑包,我尝试了以下Maven插件配置:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>3.3.0</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Export-Package>com.example
            </Export-Package>
            <Include-Resource>
                        META-INF/persistence.xml=${project.build.directory}/classes/META-INF/persistence.xml,
                        {maven-resources}
            </Include-Resource>
            <Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>
            <Require-Capability>
                        osgi.service;resolution:=optional;objectClass=javax.persistence.spi.PersistenceProvider;javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl,
                        osgi.extender;resolution:=optional;osgi.extender=aries.jpa,
                        osgi.service;resolution:=optional;objectClass=javax.sql.DataSource;filter:="(osgi.jndi.service.name=jdbc/test)"
            </Require-Capability>
        </instructions>
    </configuration>
</plugin>
因此,在Karaf中安装我的功能时出现以下错误:

执行命令时出错:无法解析根:缺少需求[root]osgi.identity;identity=简单数据源;类型=卡拉夫特征;version=“[1.0.0.快照,1.0.0.快照]”;过滤器:=“(&(osgi.identity=simple datasource)(type=karaf.feature)(version>=1.0.0.SNAPSHOT)(version如果您知道一个bundle(我们称之为
xyz
)提供了
PersistenceProvider
服务,那么您可以编写一个额外的bundle来简单地执行以下操作:

Require-Bundle: xyz; bundle-version="[...)"
Provide-Capability: osgi.service;
    objectClass=javax.persistence.spi.PersistenceProvider;
    javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl;
    effective:=active
这实质上增加了bundle
xyz
的功能,可以解决bundle中的需求,但代价是添加一个无用的bundle


这仍然是一种解决方法,但比从捆绑包中删除真正的需求要好。

当它失败时,错误消息是什么?OSGi解析器应该忽略
effective:=active
需求。我也不喜欢在ord中对捆绑包的需求进行黑客攻击——这是真正的需求er以满足某些安装平台的要求。最好找到一种方法来满足平台上的这些要求。@NeilBartlett包括错误和进一步的细节。是的,我承认这是一个肮脏的黑客行为,但我想将PU和DS分开,但如果可能的话,有一个单独的安装功能。我是OSGi noob。我有一个Ap的第三方捆绑包带有
osgi.ee;(&(osgi.ee=JavaSE)(版本=1.8))的ache Ant
,但实际上该捆绑包也可以在Java 9+上工作,这就是为什么我想重写为
>=1.8
。Ant本身使用最新的Java版本运行,只有插件限制太多。不幸的是,尝试重写此必需的功能会产生错误
不允许捆绑包在osgi.ee名称中定义功能space
。在等待上游捆绑包修复时,您知道如何在这里继续吗?很抱歉劫持您的答案。@kriegaex没有必要重写该要求。它至少需要Java 1.8。这意味着它将在1.8以上的版本上解析和运行。不,它没有。我没有发明引用的错误消息,我正在尝试为了避免。您说过错误消息是在您试图覆盖所需功能时出现的。因此,不要覆盖它,错误消息应该会消失。更清楚一点:任何捆绑包都可能对
osgi.ee
命名空间有要求。Apache Ant捆绑包对JavaSE-1.8的
osgi.ee
有要求,这意味着它将在Java-1.8及更高版本上解析和运行。不允许捆绑包在
osgi.ee
命名空间中添加功能,因为只有osgi框架本身才允许这样做…它基于框架在运行时制定的Java的实际版本。
simple (59)
-----------
Bnd-LastModified = 1513115007378
Build-Jdk = 1.8.0_144
Built-By = kerry
Created-By = Apache Maven Bundle Plugin
Manifest-Version = 1.0
Meta-Persistence = META-INF/persistence.xml
Tool = Bnd-3.2.0.201605172007

Bundle-Blueprint = OSGI-INF/blueprint/blueprint.xml
Bundle-ManifestVersion = 2
Bundle-Name = simple
Bundle-SymbolicName = com.javatechnics.jpa.simple
Bundle-Version = 1.0.0.SNAPSHOT

Export-Service = 
com.javatechnics.jpa.dao.BookServiceDao;ServiceManager=Blueprint;name=
BookServiceDao
Provide-Capability = 
osgi.service;effective:=active;objectClass=javax.persistence.EntityManagerFactory;osgi.unit.name=test,
osgi.service;effective:=active;objectClass=org.apache.aries.jpa.template.JpaTemplate;osgi.unit.name=test,
osgi.service;effective:=active;objectClass=javax.persistence.EntityManager;osgi.unit.name=test,
osgi.service;effective:=active;objectClass=org.apache.aries.jpa.supplier.EmSupplier;osgi.unit.name=test
Require-Capability = 
osgi.service;effective:=active;javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl;objectClass=javax.persistence.spi.PersistenceProvider,
osgi.extender;osgi.extender=aries.jpa,
 osgi.service;effective:=active;filter:=(osgi.jndi.service.name=jdbc/test);objectClass=javax.sql.DataSource,
osgi.ee;filter:=(&(osgi.ee=JavaSE)(version=1.5))

Export-Package = 
com.javatechnics.jpa;uses:="com.javatechnics.jpa.dao,javax.persistence";version=1.0.0,
com.javatechnics.jpa.dao;uses:=com.javatechnics.jpa;version=1.0.0
Import-Package = 
com.javatechnics.jpa,
com.javatechnics.jpa.dao,
javax.persistence;version="[1.1,2)",
org.osgi.service.blueprint;version="[1.0.0,2.0.0)"
Require-Bundle: xyz; bundle-version="[...)"
Provide-Capability: osgi.service;
    objectClass=javax.persistence.spi.PersistenceProvider;
    javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl;
    effective:=active