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,而是使用者形式的问题,然而从理论应用来看还是有很多状况无奈防止,所以应用该插件时还是要留神,举荐两种形式:

  1. 不要应用过于简短通配的形式来重命名,例如间接重命名org下的所有包
  2. 尽可能的应用齐全包名进行匹配,当然,这种状况取决于你在常量中是否有相似的值,例如完整包名之类的。