2017-09-22 25 views
2

私の仕事では毎日Sparkを使っています。依存関係の競合によって問題の1つが発生します。私は助けることはできませんが、人々がすでに自分の名前空間に陰影をつけた瓶を放せば、彼らはすべて去ると思う。依存関係をシェードする必要がありますか?

内部ジャーの場合、私はこれをすべての依存関係に対して行うことを検討しています。仕事の小さなビット以外に、私はこれを良いアイデアとして見ています。欠点やリスクはありますか?

+1

明らかにbloatに問題があります。独自のバージョンの 'Spark'を含む10個のライブラリをインクルードすると、' Spark'ジャーは依存バージョン解決を使って1つのバージョンを選んだ場合の10倍になります。すべてのバージョンをリポジトリ(例えば、ネクサス)に公開すると、追加のjarファイルがネクサスのディスクスペースのかなりの部分を占めていることがわかります –

+0

この質問はピットで、下部は実現です。あなたに最適。 – awd

答えて

0

いくつかの問題は陰影で消え去るが、新しい問題が発生する。 1つの問題は、ユーザーがシェーディングで使用されるバージョンとは異なる(パッチ適用された)バージョンの依存関係を使用する可能性を排除することです。 しかし、シェーディングの主なリスクは、影付きクラスがクライアントに公開されることです。

したがって、2つの依存関係a、b、各シェーディングlog4jがあるとします。したがって、aとbを含めると、コンパイル/ランタイムクラスパス上にクラスa.shaded.log4j.Logger(v1.3)とb.shaded.log4j.Logger(1.4)が生成されます。そしてあなた自身のlog4j.Logger(1.5)を持っているかもしれません。

ランタイム時にシステム内のすべてのロガーで何かしたいのですが、突然ランタイムにさまざまなロガークラスとクラスバージョンが発生します。

シェーディングは、ライブラリのAPIを使用してクライアントに影付きクラスのインスタンスが表示されないようにすることができます。しかし、これは保証することは非常に困難です。おそらくJava9のモジュールでは少し問題はありませんが、クラスパス上のクラスの既知のバージョンを1つしか持たなくても、名前は同じですが異なるバージョンの影付きクラスの野生の混合よりもはるかに簡単にデバッグ/管理できます。

関連する問題