重写Maven Bundle插件中需要的功能
我的问题类似于,但我使用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
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
这实质上增加了bundlexyz
的功能,可以解决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