我的问题类似于this one,但我正在使用Maven包插件来实现相同的最终结果。
我正在构建一个包含persistence.xml文件的包,并且我发现maven-bundle-plugin会在清单中自动生成以下标题:
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;effective:=active;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>然而,我得到的问题与上面的链接问题相同,即清单中重复的要求。
我还从上述问题的链接中看到,对bnd (bnd问题#1364)进行了更改,但这似乎只适用于注释吗?是否有方法配置Maven插件以防止重复的需求?
更新#1
我的示例代码可在GitHub (karaf_features分支)获得:features
它由3个模块组成,但只有2个模块对此问题感兴趣,即simple和simple-datasource。
simple是“持久性单元”,包含persistence.xml。它也是生成“尴尬”(但实际的需求) <Require-Capability>头的包。
simple-datasource向持久化单元提供数据源,并包含用于安装simple、simple-datasource包和所有所需的第三方捆绑包(通过Karaf特性)的Karaf特性。特性XML包含:
<feature name="simple-datasource" description="simple-datasource" version="1.0.0.SNAPSHOT">
<feature version="4.1.1">jdbc</feature>
<feature version="2.6.0">jpa</feature>
<feature version="2.4.1">openjpa</feature>
<feature version="1.0.1">pax-jdbc-mariadb</feature>
<bundle>mvn:com.javatechnics.jpa/simple-datasource/1.0.0-SNAPSHOT</bundle>
<bundle>mvn:com.javatechnics.jpa/simple/1.0.0-SNAPSHOT</bundle>
</feature>因此,在Karaf中安装我的特性,我得到了以下错误:
执行命令错误:无法解决根:缺少需求根osgi.identity;osgi.Identity=simple-数据源;type=karaf.feature;version=“1.0.SNAPSHOT,1.0.SNAPSHOT”;version= [原因:无法解决简单-数据源/1.0.0.SNAPSHOT:缺少需求简单-数据源/1.0.SNAPSHOT osgi.identity;osgi.identity=com.javatechnics.jpa.simple;type=osgi.bundle;version=“1.0.SNAPSHOT,1.0.0.SNAPSHOT”;resolution:=mandatory [原因:无法解析com.javatechnics.jpa.simple/1.0.0.SNAPSHOT:缺少需求com.javatechnics.jpa.Simple/1.0.SNAPSHOT osgi.service;objectClass=javax.persistence.spi.PersistenceProvider;javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl;effective:=active]
对我来说,这个错误几乎像一个循环引用问题,但我不知道怎么回事。
检查simple包的头:
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)"发布于 2017-12-13 23:35:01
如果您知道一个包(我们称之为xyz )提供了PersistenceProvider服务,那么您可以编写一个附加的包,只需这样做:
Require-Bundle: xyz; bundle-version="[...)"
Provide-Capability: osgi.service;
objectClass=javax.persistence.spi.PersistenceProvider;
javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl;
effective:=active这在本质上增强了包xyz的功能,它将解决包中的需求,而代价是添加一个其他无用的包。
这仍然是一种解决办法,但比从包中移除真正的需求要好。
https://stackoverflow.com/questions/47738402
复制相似问题