2016-08-16 153 views
0

自從我編寫了很多代碼之後,已經有一段時間了,因此請耐心等待一些基本問題!管理軟件包依賴關係

我正在嘗試爲Atlassian Confluence編寫一個與另一個第三方平臺集成的插件。該第三方平臺提供了一個SDK庫,以用於其REST API。這是一個方便的使用方法,因爲我只是試圖快速構建一個概念的原型。我使用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定製版本,我猜想它與SDK庫使用的新澤西庫(1.19.1)發生衝突。如果我在我的項目中指定了Atlassian Jersey版本,它會編譯並安裝,但在嘗試運行時會失敗。如果我指定SDK庫使用的Jersey版本,它會編譯但不能正確安裝。 有什麼我可以做的關於澤西圖書館版本差異,以便我可以在我的項目中使用SDK庫?

如果有要求,我會提供錯誤的詳細信息,但我很確定它與澤西島版本衝突有關,因爲這兩種情況下的錯誤都是「NoSuchMethod」和類別強制轉換澤西類的異常。

回答

1

2個不同SDK使用不同版本的庫的情況有點難以解決。例如在你的情況下,你將不得不找到可以解決這兩個問題的Jersey依賴關係的可傳遞版本。您將必須找出外部SDK(使用樹)的依賴關係,並選擇排除它引用的特定版本(使用排除項),捆綁一個可以解決依賴關係並運行maven的傳遞版本目標。您也可以從這些線索enter link description hereenter link description here中獲得一個好主意。希望它有幫助

1

您可以使用一些工具重新打包第三方SDK及其依賴關係,重新命名包名以避免與confluence自帶的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.codehaus.plexus.util類及其子包到包org.shaded.plexus.util插件移動相應的JAR文件條目並重寫受影響的字節碼。 Xpp3Dom和其他一些類將保留在原始包中。