2

実行時に拡張機能をロードする機能を提供するために、ホスト アプリケーションで Apache Felix を使用しています。メカニズムはうまく機能しますが、特定の依存関係を含めると、バンドルの開始に関して非常に気まぐれな動作が発生します。たとえば、pom.xml で次を使用するとします。

<packaging>bundle</packaging>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.5.0</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
                    <Bundle-Name>${project.artifactId}</Bundle-Name>
                    <Bundle-Version>1.0.0</Bundle-Version>
                    <Bundle-Activator>${pom.groupId}.activator.Activator</Bundle-Activator>
                    <Include-Resource>{maven-resources}, {maven-dependencies}</Include-Resource>
                    <Import-Package>*</Import-Package>
                    <Embed-Dependency>jackson-core</Embed-Dependency>
                    <Embed-Transitive>true</Embed-Transitive>
                </instructions>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.osgi.core</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjtools</artifactId>
        <version>1.8.2</version>
    </dependency>
    <dependency>
        <groupId>co.ff36</groupId>
        <artifactId>halo.core</artifactId>
        <version>1.0.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

すべてが完全に機能し、バンドルが登録されて開始されます。ただし、バンドルに含めるasync-http-clientと、登録されますが起動しません! 親が親ホスト アプリケーションによって依存関係を公開しているにもかかわらず、依存関係をバンドルに埋め込もうとしました。コンパイルされたバンドルの中を見ると、jar が含まれていますが、実際には起動しません。

追加してみました:

    <dependency>
        <groupId>com.ning</groupId>
        <artifactId>async-http-client</artifactId>
        <version>1.9.31</version>
    </dependency>

および変更:

<Embed-Dependency>jackson-core, async-http-client</Embed-Dependency>

これらのオプションはどちらも機能しません。ホストアプリケーションでエラーが発生していません.一部のライブラリがこれを引き起こし、他のライブラリはそうではない理由を理解できません.

4

2 に答える 2

0

さらに調査した結果、問題はバージョン管理に関連していることが判明しました。作成されたバンドルMANIFEST.MFには、一部のインポート パッケージのバージョンが明示的に記載されています。

Import-Package: ...,com.fasterxml.jackson.core.type;version="[2.4,3)",com.ning.http.client;version="[1.9,2)",
 org.osgi.framework;version="[1.5,2)"

ただし、ホスト アプリケーションはバージョンを指定しません。

Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA -> ... com.ning.http.client ...

バージョンはホストで明示的に指定する必要があり、バンドルのインポートと一致する必要があるようです。そうしないと、バンドルがアクティブになりません。

于 2015-12-04T08:41:40.790 に答える
0

Jackson は、埋め込む必要のない OSGi バンドルとしてアクセスできます。felix webconsole またはその他のタイプのコンソールを使用している場合は、バンドルが ACTIVE 状態にならない原因となっているインポート (または機能) が提示されていないことを確認できます。POM は、推移的な形式に含まれるすべての依存関係を示します。これを使用するのはお勧めできません。他のバンドルからクラスがロードされないことを意味するためです。すべてが埋め込まれているのではなく、バンドルから何も使用しないモノリシック バンドルを作成することを意味します。

開始しない別の考えられる理由は、OSGi 仕様で定義されているように、アクティベーターがアクティベーターを無効にする例外をスローするメソッドを呼び出すことです。ログを確認することをお勧めします。バンドル プラグインによって明示されていないため、解決できないリフレクション インスタンス化クラスがコードに含まれている可能性があります。インポートできるのは、クラス インポートで提示されるパッケージのみです。

于 2015-12-03T23:15:35.967 に答える