4

私の質問はこれに似ていますが、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 機能を独自の 1 つの機能にデプロイしたいと考えています。これを行うと、同時にインストールosgi.service;effective:=active;objectClass=javax.persistence.spi.PersistenceProvider;javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImplする機能を指定しても、OSGi がその機能を実行できないために失敗します。に変更するopenjpaことでこの問題を回避できることを発見しましたeffective:=activeresolution:=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 issue #1364) が、これは注釈に対してのみ機能するように見えますか? 要件の重複を防ぐために Maven プラグインを構成する方法はありますか?

更新 #1

サンプル コードは GitHub (karaf_features ブランチ) で入手できます: https://github.com/jtkb/jpatest/tree/feature/karaf_features

simple3 つのモジュールで構成されていますが、この問題で重要なのは 2 つだけです。simple-datasource

simpleは「持続性ユニット」であり、persistence.xml. これは、「厄介な」(まだ実際の要件である) <Require-Capability>ヘッダーが生成されるバンドルでもあります。

simple-datasource持続性ユニットにデータソースを提供し、インストールするための Karaf 機能simplesimple-datasourceバンドル、および必要なすべてのサードパーティ バンドルを (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; osgi.identity=単純なデータソース; タイプ=カラフ.機能; バージョン="[1.0.0.SNAPSHOT,1.0.0.SNAPSHOT]"; filter:="(&(osgi.identity=simple-datasource)(type=karaf.feature)(version>=1.0.0.SNAPSHOT)(version<=1.0.0.SNAPSHOT))"

[原因: simple-datasource/1.0.0.SNAPSHOT を解決できません: 要件がありません [simple-datasource/1.0.0.SNAPSHOT] osgi.identity; osgi.identity=com.javatechnics.jpa.simple; タイプ=osgi.bundle; バージョン="[1.0.0.SNAPSHOT,1.0.0.SNAPSHOT]"; 解像度:=必須

[原因: 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; 有効:=アク​​ティブ]]

私にとってのエラーは、循環参照の問題のように感じますが、その方法がわかりません。

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)"
4

1 に答える 1