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

覆盖 Maven 捆绑包插件中的需求功能

廖君昊
2023-03-14

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

我正在构建一个包含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无法实现<code>OSGi.service;有效:=有效;objectClass=javax.persistence.spi.PersistenceProvider;persistence.provider=org.apache.openjpa.persistency。PersistenceProviderImpl即使我指定同时安装<code>openjpa

为了构建我的捆绑包,我尝试了以下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插件以防止重复的需求?

我的示例代码可在 GitHub(karaf_features 分支)上找到:https://github.com/jtkb/jpatest/tree/feature/karaf_features

它由3个模块组成,但只有2个模块是这个问题感兴趣的,< code>simple和< code>simple-datasource

< code>simple是“持久性单元”,包含< code>persistence.xml。它也是“笨拙的”(然而是真实的需求)<代码>

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中安装我的功能时会出现以下错误:

执行命令时出错:无法解析根:缺少要求[root]osgi。身份奥斯基。identity=简单数据源;类型=卡拉夫。特色version=“[1.0.0.快照,1.0-0.快照]”;过滤器:=“(

[原因:无法解析simple-data source/1 . 0 . 0 . snapshot:缺少要求[simple-data source/1 . 0 . 0 . snapshot]OSGi . identity;OSGi . identity = com . Java technics . JPA . simple;type = osgi.bundle版本="[1.0.0 .快照,1.0.0 .快照]";解决方案:=强制

[原因:无法解决com.javatechnics.jpa.simple/1.0.0.SNAPSHOT:缺少需求[com.javatechnics.jpa.simple/1.0.0.SNAPSHOT]osgi.service;ObjectClass=javax.persistence.spi.PersistenceProvider;javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl;有效:=活动]]

对我来说,这个错误几乎感觉像是一个循环引用问题,但我看不出是怎么回事。

检查< code>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)"

共有1个答案

隗嘉歆
2023-03-14

如果您知道某个包(姑且称之为< code>xyz)提供了< code>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,该功能将解决捆绑包中的要求,但代价是添加了一个原本无用的捆绑包。

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

 类似资料:
  • 我想重写maven checkstyle插件中的configLocation选项。pom.xml的示例部分是: 正如上面可以看到的,checkstyle-config是一个单独的maven项目,它包含用于样式检查的规则,用于规则的配置文件是blahblah/checkStyle/checkStyle.xml。如果我必须重写blahlah/checkstyle/checkstyle.xml并使用存储

  • 和子级POM: 在子pom上运行'mvn clean install'将运行编译器插件的两个执行,并且只运行antrun插件的第一个执行,尽管每个插件的第一个执行都绑定到一个阶段。 现在将pluginManagement移动到子POM:

  • 我有一个Maven插件,它在POM文件中配置为 现在我想从命令行覆盖那个,所以我运行 我可以看到的值仍然是,而不是。可以从命令行覆盖配置参数吗?

  • 我有一个使用OSGi-(felix)、SpringDM、hibernate和maven的项目。当我安装捆绑包时,它是正常的,当我运行捆绑包id时的输出是: 这是我在启动此捆绑包时看到的: 这是我的beans.xml: 这是我的pom文件: 此外,在felix中存在一个完整的捆绑错误。

  • 我是Apache karaf和OSGI的新手。我正在尝试编写和运行一个非常简单的捆绑包。但是我在启动该捆绑包时遇到了这个错误: 执行命令时出错:在捆绑包上执行命令时出错:无法解析karaf[86](R 86.0):缺少需求[karaf[86](R 86.0)]osgi。装电线。包裹(osgi.wiring.package=bundle)未解决的需求:[[karaf[86](R 86.0)]osgi

  • 我一直在绞尽脑汁研究maven插件的执行顺序和生成类的打包。 我需要从XSD生成带有注释的pojos,为此我使用maven-jaxb2-plugin,它消耗一个binding.xjb(一个由要注释的完全分类的字段名组成的xml文件)文件并将注释添加到生成的pojos。除此之外,我还有一个从映射文件动态生成binding.xjb文件的机制,目的是只提供yaml文件格式的映射,而不是binding.x