Mave的Shade插件常常用来做打包文件(Java文件,properties文件)的一些修改,其中RelocationClass功能是shade插件非常实用的包重命名的功能,可以处理包冲突,实现依赖包名定制化的功能,但同时在插件配置上也容易因为错误配置导致一些问题,下面来说其中的问题之一:常量值被修改。
背景&现象
先通过配置文件说目的,下面的配置文件的目的是想通过配置文件修改com开头的包在打包时都修改为vzr开头,配置文件如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com</pattern>
<shadedPattern>vzr</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
修改前
修改后
再说上面的现象,发现这个问题是因为打出的包被其他项目依赖时发现某些类中的常量值被修改,如上图,静态常量的A和打印中的compress值当中com开头的部分都被替换为vzr,这显然不是我们想要的,我们想要的只是更换pacakge的名称。
解决方法
如果只是想修改包名,例如:com替换为vzr,那么在配置文件的relocation部分只能按照如下方式来写:
<relocation>
<pattern>com.</pattern>
<shadedPattern>vzr.</shadedPattern>
</relocation>
<!-- 或者 -->
<relocation>
<pattern>com.*</pattern>
<shadedPattern>vzr.*</shadedPattern>
</relocation>
这样就只会替换包名而不会波及变量名称。
但是对于值为com.开头的常量,依然不能完全避免,所以使用shade插件时要特别注意这一点。
本文中只解决了部分问题。
有没有办法彻底解决?
通过这个问题我也查了一些相关资料,国内并没有太多有用的资料,但是在Shade Plugin的issues中找到了同样的问题shade plugin is transforming also strings that are not supposed to be transformed,但是issue的状态仍然是open,可能开发者并不认为这是个BUG,而是使用者方式的问题,但是从实际使用来看还是有很多情况无法避免,所以使用该插件时还是要注意,推荐两种方式:
- 不要使用过于简短通配的方式来重命名,例如直接重命名org下的所有包
- 尽可能的使用完全包名进行匹配,当然,这种情况取决于你在常量中是否有类似的值,例如完整包名之类的。