乐趣区

关于后端:Maven-Shade插件Relocation修改类常量的问题

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. 尽可能的应用齐全包名进行匹配,当然,这种状况取决于你在常量中是否有相似的值,例如完整包名之类的。
退出移动版