それぞれ 3 つのカスタム バンドル (api、impl、web) を含む 3 つの Karaf 機能があります。各機能の「impl」バンドルには、その機能で使用されるエンティティも含まれています。これらの機能を Karaf 3.0.1 にデプロイし、Karaf 3.0.1 に付属の OpenJPA 2.3.0 を永続化プロバイダーとして使用します。
3 つの機能のエンティティに対して、動的ランタイム拡張を使用します。2 つの機能の場合、エンティティは展開時に常に強化され、正常に動作します。問題は、3 番目のフィーチャーの場合、Karaf と OpenJPA がエンティティーのサブセットを拡張できず、次の例外が発生する場合があることです。
<openjpa-2.3.0-r422266:1540826 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: "
<list-of-missed-unenhanced-classes>"
at org.apache.openjpa.enhance.ManagedClassSubclasser.prepareUnenhancedClasses(ManagedClassSubclasser.java:115)
at org.apache.openjpa.kernel.AbstractBrokerFactory.loadPersistentTypes(AbstractBrokerFactory.java:312)
at org.apache.openjpa.kernel.AbstractBrokerFactory.initializeBroker(AbstractBrokerFactory.java:236)
at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:212)
at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:155)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:226)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:59)
...
このオプションは認識していopenjpa.RuntimeUnenhancedClasses
ますが、既知の制限があり、OpenJPA 2.0.0 ではデフォルトで無効になっているため、使用したくありません。
私たちはコンパイル時の拡張機能を認識しており、それをうまく使用していますが、実行時の拡張機能を有効にしようとする理由があります。
私たちの現在の理解では、EntityManagerFactory の作成時に、OpenJPA は PersistenceUnitInfo コールバック (Karaf によって使用される ClassTransformer) を介して Aries JPA に登録されます。この ClassTransformer は、実際には最初の 2 つの機能のすべてのエンティティに使用されますが、3 番目の機能のエンティティのサブセットにのみ使用されます。
さらに調査して、ClassTransformer が登録された時刻と、各エンティティ クラスが読み込まれた時刻をログに記録しようとしました。2 つの成功したバンドルと失敗したバンドルの違いに気付きましたが、これは関連する場合と関連しない場合があります。後続のバンドルの場合、Aries JPA フィーチャーは、ClassTransformer 登録の直前に各エンティティ クラスのロードを試みますが、失敗したモジュールの場合、そのような試みはありません。