shade
包冲突,现在碰到这样一个问题,如下图,
- a依赖b,b依赖c的c1方法
- a依赖c的c2方法
- 但是c1.0没有c2方法,c2.0没有c1方法
原因
jvm在加载类时,只会根据包名去加载类,如果一个方法调用了一个类的两个版本,而这两个版本是互相冲突的话,就会抛异常NoSuchMehtodError
解决办法
maven-shade 把其中一个用shade改名,改名的类的包名会变,所以再加载两个不同方法时就是加载的两个不同的类,所以不会报错
<!-- shade-a: pom.xml -->
<dependencies>
<dependency>
<groupId>com.test</groupId>
<artifactId>shade-c</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.test</groupId>
<artifactId>shade-b</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<!-- shade-b: pom.xml -->
<dependencies>
<dependency>
<groupId>com.test</groupId>
<artifactId>shade-c</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<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>
<configuration>
<relocations>
<relocation>
<pattern>com.test.shade-c</pattern>
<shadedPattern>shaded.com.test.shade-c</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
<executions>
</plugin>
<plugins>
</build>