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。没有则跳过。