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