1. 程式人生 > 其它 >maven多版本衝突解決

maven多版本衝突解決

技術標籤:mavenjavajar

maven多版本衝突解決

以下將以fabric-sdk-java依賴jar包進行說明。例如將Project B整合到Project A上,Project B這部分的程式碼始終跑不過,不是跳出來找不到某個類就是在類中又找不到某個方法,但是去本地依賴jar包對應版本檢視的時候又是有這個方法或者是類的。如果你仔細跟程式碼就會發現Project B依賴jar包版本並不是自身依賴的版本,而是跳轉到了Project A所依賴的jar包版本去了。依賴相同版本不相同,所以有少部分的類或者方法是有出入的。而我所遇到的就是Project B所依賴fabric-sdk-java的jar包裡面又依賴了其他的jar包,而依賴的這個jar包有些依賴的版本和Project A依賴的一些jar包產生衝突,具體解決辦法看下面。

解決辦法:

  • 使用exclusion將衝突的版本給剔除掉。

    • 這個大多隻適用於一個project下進行操作。在兩個版本都不影響工程的情況下剔除一個版本即可。
  • 使用maven-shaded-plugin進行全依賴打包。

    • 這種情況適用於不同的工程運用相同依賴的不同版本。比如:在project A中依賴了某個版本的netty-all.1.4.17.jar,而fabric依賴的是nettty-all.1.4.43.jar。這個時候兩個版本都不能剔除,剔除了版本1.4.17則projectA跑不起來,剔除了1.4.43版本則fabric也會出問題,這個時候就需要對fabric進行重定向打包了,具體步驟如下。

    • 步驟1:在git全域性搜尋fabric-sdk-java,會跳出來hyperledger/fabric-sdk-java,具體依賴具體而定。

    • 步驟2:點選進去選取你想要的版本並將原始碼克隆下來。

    • 步驟3:在pom檔案裡面新增maven-shade-plugins相關程式碼,如下。

         <build>
           <plugins>
           	     <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId
      >
      maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
    • 步驟4:打包(1. 如果是idea則在右側maven工程下對應plugins會有一個shade:shade,點選即可打包。2.其他則在控制執行mvn clean package命令進行打包即可)。

    • 注意:如果對fabric-sdk-java進行依賴打包,執行專案還會報找不到某個類或者方法,那就對這個類或者方法相關的包進行重定向即可,相關參考程式碼如下。

       <build>
           <plugins>
           	     <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-shade-plugin</artifactId>
                      <version>3.2.1</version>
                      <executions>
                          <execution>
                              <phase>package</phase>
                              <goals>
                                  <goal>shade</goal>
                              </goals>
                          </execution>
                      </executions>
                      <configuration>
                          <filters>
                              <filter> //過濾掉一些重複的依賴
                                  <artifact>*:*</artifact>
                                  <excludes>
                                      <exclude>META-INF/*.SF</exclude> 
                                      <exclude>META-INF/*.DSA</exclude>
                                      <exclude>META-INF/*.RSA</exclude>
                                  </excludes>
                            </filter>
                          </filters>
                          <createDependencyReducedPom>true</createDependencyReducedPom>
                          <relocations>   
                              <relocation>
                              <pattern>org.bouncycastle</pattern> //將包名進行從定向
                              <shadedPattern>shaded.org.bouncycastle</shadedPattern>
                          </relocation>
                          <relocation>
                              <pattern>com.google.protobuf</pattern>
                              <shadedPattern>shaded.com.google.protobuf</shadedPattern>
                          </relocation>
                          <relocation>
                              <pattern>io.netty</pattern>
                              <shadedPattern>shaded.io.netty</shadedPattern>
                          </relocation>
                          </relocations>
                      </configuration>
                  </plugin>
           </plugins>
         </build>
      
    • 注意:將io.netty重定向過後,控制檯可能會報在META-INF/native會報找不到shade_netty_tcnative_windows_x86_64.dll的庫檔案,對於這種情況直接進入依賴包對應的META-INF/native路徑將.dll字尾的庫檔案修改為對應的庫檔案即可。比如netty_tcnative_windows_x86_64.dll改為shade_netty_tcnative_windows_x86_64.dll。沒有則跳過。