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