2016-09-27 7 views
2

私はすでに答えを知っていると思いますが、誰かが私のためにそれを確認できるかどうかは分かります。maven-shade-pluginとsingletons

A) We are including a library in a build using maven-shade-plugin; 
B) This library implements singleton(s); 
C) Our resulting jar (uber-jar) is, in turn, used in a build of a megaproject; 
D) Other jars in a megaproject also using the same library (A); 

ライブラリ(A)はメガプロジェクト全体でシングルトンとして機能しませんか? 影付きのアーティファクトのコピーごとに、別々の静的変数のセットがありますか? maven-shade pluginヘルプの代わりにmaven-assembly-pluginを使用しますか?

+0

maven-shade-pluginはシングルトンにどのように関係していますか? –

+0

私は、マルチシャドープロジェクトでは、(例えば)mypackage.Mysingletonクラスのいくつかの実装が含まれていると思います。そして、私はこれらの実装がお互いの静的なプロパティを見ることができないことを恐れています。 – Alexander

答えて

1

あなたは、同じクラスがクラスパスに2回以上出現するシナリオを説明しました。

このようなアプリケーションでは、クラスローダーは、そのクラスを探すときに最初に見つかったクラスローダーを選択します。一度見つけたら、このクラスはこのクラスローダーによって読み込まれ、初期化され、彼は再びそれを調べません。通常、それは問題につながることはありません。そして、あなたは一人のインスタンスだけ、あなたが望むようにシングルトンを持っています。

何らかの理由で複数のクラスローダーが手元にある場合は、別の場所からこのクラスをロードできます。だから、いくつかのシングルトンインスタンスで終わることができます。

シェードプラグインは、そのための最良のツールではないようです。私はあなたが単一の影付きのJAR(最終製品)にパッケージングするスタンドアロンアプリケーションに対してのみ使用することをお勧めします。

アセンブリされたアセンブリに対して、より細かい制御が可能なので、アセンブリプラグインは常に使用します。しかし、シェーディングされたJARを依存関係として使用するのではなく、単純にコアライブラリを使用するべきです。プロジェクトのさまざまな依存関係のパスに同じ依存関係があっても、アセンブリプラグインはそれを一度しかパッケージ化しません。

+0

さて、私はそれを得た。私はmaven-shade-pluginへの依存を減らすことができたらいいと思う。私たちのような大規模な組織では、 "メガプロジェクト"はいくつかのコンポーネントに依存しており、それらは同じライブラリに依存しています。そのライブラリは活発なプロジェクトであり、しばらくの間、変更が導入されています。 Maven-shade-pluginがなければ、すべてのコンポーネントを同期してアップグレードしなければならず、これは物流上の悪夢でした。 maven-shade-pluginはそれを解決するように見えましたが、今ではこれらの問題を見ています。 – Alexander

関連する問題