7

ここに完全にリストされている単一のソースファイルを含むプロジェクトがあります。

package com.acme.el;

public class ExpressionUtils {
    public static Object evaluate() {
        new org.apache.commons.el.ExpressionEvaluatorImpl();
        return null;
    }
}

機能は質問とは無関係です。Gradle を使用してプロジェクトを OSGi バンドルとしてビルドすると、マニフェストに次の命令が含まれます。

Export-Package: com.acme.el;uses:="org.apache.commons.el";version="1.0"

私を当惑させるのは、そのuses指示です。私がディレクティブを理解しているように、このエクスポートされたパッケージをインポートする他のバンドルに伝播する必要がある他のパッケージへの依存関係を定義することを意図しています - たとえば、私のクラス定義またはメソッド署名がorg.apache.commons.elパッケージ内のクラスを参照している場合。しかし、このクラスでは、への依存関係はメソッドの本体org.apache.commons.elに完全に含まれています。これは API で公開されておらず、他のバンドル インポートはメソッドで作成されたインスタンスを取得できませんでした。したがって、依存関係を伝播する必要はありませんよね?com.acme.elExpressionEvaluatorImpl

usesディレクティブの意味を誤解しましたか、それともここで使用する必要はありませんか?

Eclipse で Gradle プロジェクトとしてクローンおよびインポートできる再現用の最小限のサンプル GitHub リポジトリを作成しました。

4

2 に答える 2

9

bnd ファイルで-experiments: true、適切な uses: 句を取得する必要があると設定した場合は、パブリック API 参照にのみ基づいてください。

問題は、最初から bnd がすべてのインポートを使用して uses 制約を計算していたことです。これは群を抜いて簡単で、これまで誰も文句を言ったことはありません。ただし、パブリック API をスキャンするコードを作成しましたが、実験段階から削除するほどの自信はありませんでした...現在のモデルでは、あまりにも多くの使用制約が作成されていますが、一般的に安全な方法である必要があります。

このコードは十分にテストされておらず、この計算を変更しても既存のビルドで問題が発生しないという自信はありません。だから私はここで少し縛られています。

于 2013-07-02T12:27:00.687 に答える