1

AEM 5.6.1 を使用しています。コンソールに jax-b api 2.2.12 を手動でインストールすると、バンドルの JAXB で例外が発生します。JAX-b(2.1.0) は、以下のバンドルによって AEM の内部で既に提供されているためです。2.2.12 が存在しない場合、この例外は発生しません。また、私のバンドルの後に jax-b 2.2.12 がインストールされていれば、まったく問題ありません。

ただし、この新しいバージョンは、別のベンダーが開発した別のバンドルで使用されています。したがって、この新しいバンドルを Felix コンソールから削除することはできません。

オリジナルの JAX-B 2.1.0 を提供するシステムバンドル

`<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.fragment.xml</artifactId>
<version>1.0.2</version>
</dependency>`

maven pom を使用した構成によって、バンドルに jax-b 2.2.12 の検索を無視させ、システムのデフォルト 2.1.0 バージョンのみを取得させるにはどうすればよいか考えていました。具体的には、POM の Maven バンドル プラグインで。

私の ABC クラスでメソッドをアクティブにします。

`@Activate
public void activate(ComponentContext ctx) throws JAXBException {
        abcContext = JAXBContext.newInstance(ABC.class);
    }`

現在のバンドル プラグイン インポート パッケージの定義:

<Import-Package>                            
                        *;resolution:=optional
                    </Import-Package>

例外:

16.03.2016 03:13:05.709 *ERROR* [Background Update foo.barsupport-bundle (606)] foo.barsupport-bundle [foo.bar.calendar.impl.CalendarEventParserImpl] The activate method has thrown an exception (javax.xml.bind.JAXBException
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory not found by cqse-httpservice [25]]) javax.xml.bind.JAXBException
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory not found by cqse-httpservice [25]]
         at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:241)
         at javax.xml.bind.ContextFinder.find(ContextFinder.java:477)
         at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:656)
         at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:599)
         at foo.bar.integration.calendar.impl.CalendarEventParserImpl.activate(CalendarEventParserImpl.java:33).

どんな助けでも本当に感謝しています。

4

2 に答える 2

2

一般に、問題は、バンドルがデフォルトで [2.0, 3.0) を受け入れることです。これは、セマンティック バージョニング(Major.Minor.BugFix) に最適です。ただし、バンドルが新しいバージョンを使用し、そのバンドルの古いバージョンを使用するフレームワークへのこれらのクラスの一部と通信する場合、ランタイムでその種の ClassNotFoundException を取得できます。

uses ディレクティブは、複数の互換性のあるバージョンと複数のインポーターがある場合に、それらのインポーターが同じバージョンでそれらの間で通信することを確認するために作成されます。通常、他のパッケージがインポートされたパッケージをバンドルがエクスポートするときに発生します。これが、何もエクスポートしない API バンドルまたは何かをエクスポートする Impl バンドルを使用することをお勧めする理由です。これにより、使用する必要がなくなります。

于 2016-03-18T14:20:35.360 に答える