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