2016-08-16 10 views
0

私は多くのコーディングをしてからしばらくしています。パッケージの依存関係を管理する

私は別のサードパーティのプラットフォームと統合するAtlassian Confluence用のプラグインを作成しようとしています。このサードパーティのプラットフォームは、REST APIと共に使用するためのSDKライブラリを提供します。私は実際にコンセプトを素早くプロトタイプ化しようとしているので、使いやすいものです。私はJava 1.8、IntelliJ、Maven、Confluence 5.8を使用しています。

ここに私の最初の問題があります。私が依存関係として含めるサードパーティSDKライブラリは、それ自身の依存関係を持っています。とりわけ、これは一例です:

<!-- HTTP client: jersey-client --> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-client</artifactId> 
     <version>${jersey-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey.contribs</groupId> 
     <artifactId>jersey-multipart</artifactId> 
     <version>${jersey-version}</version> 
    </dependency> 

    <!-- JSON processing: jackson --> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>${jackson-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>${jackson-version}</version> 
    </dependency> 

あなたは考えがあります。私の最初の問題は、サードパーティのSDKライブラリが正常に追加されず、SDKの依存関係を自分のプロジェクトに追加せずにプロジェクトをコンパイルすることができなかったことです。 これは期待ですか?私の瓶の大きさはかなり膨らんでいます。

これは次の問題につながります。 Confluenceは既にJerseyライブラリ(1.8-atlassian-16)の旧バージョンとAtlassian-customizedバージョンを使用していますが、SDKライブラリで使用されている新しいJerseyライブラリ(1.19.1)と衝突していると思われます。私のプロジェクトでAtlassian Jerseyのバージョンを指定すると、コンパイルとインストールが実行されますが、失敗します。 SDKライブラリが使用するJerseyのバージョンを指定すると、コンパイルされますが正しくインストールされません。 私のプロジェクトでSDKライブラリを使用できるように、このJerseyライブラリのバージョンの違いについて何かできることはありますか?

リクエストがあればエラーの詳細を提供しますが、ジャージーバージョンのクラッシュについては、「NoSuchMethod」とJerseyクラスのクラスキャスト例外が両方ともエラーであると確信しています。

答えて

1

異なるバージョンのライブラリを使用する2つの異なるSDKの状況は、解決するのが少し難解です。たとえばここでは、両方を解決できるJersey依存の推移的なバージョンを見つける必要があります。外部SDKの(ツリーを使用している)依存関係を調べ、それが参照する特定のバージョンを除外(除外を使用)するかどうかを選択し、依存関係を解決してmavenを実行できる推移的バージョンをバンドルします目標。これらのスレッドenter link description hereenter link description hereからも良いアイデアが得られます。うまくいきたいです

1

サードパーティ製のSDKを依存関係とともにパッケージ化し、コンフルエンス自身のjarファイルとの衝突を避けるためにパッケージ名を変更することができます。

たとえば、jarjar

以上、the maven shade pluginを使用します。

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.4.3</version> 
     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>shade</goal> 
      </goals> 
      <configuration> 
      <relocations> 
       <relocation> 
       <pattern>org.codehaus.plexus.util</pattern> 
       <shadedPattern>org.shaded.plexus.util</shadedPattern> 
       <excludes> 
        <exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude> 
        <exclude>org.codehaus.plexus.util.xml.pull.*</exclude> 
       </excludes> 
       </relocation> 
      </relocations> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

これは、パッケージのorg.shaded.plexus.utilにパッケージorg.codehaus.plexus.utilとそのサブパッケージからクラスを移動するためのプラグインに指示します対応するJARファイルのエントリを移動し、影響を受けるバイトコードを書き換えます。 Xpp3Domクラスとその他のクラスは、元のパッケージのままです。