写点什么

Maven Shade 插件 relocation 修改类常量的问题

作者:Laughing
  • 2023-02-16
    北京
  • 本文字数:1130 字

    阅读完需:约 4 分钟

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


发布于: 刚刚阅读数: 4
用户头像

Laughing

关注

还未添加个人签名 2017-10-17 加入

还未添加个人简介

评论

发布
暂无评论
Maven Shade插件relocation修改类常量的问题_Laughing_InfoQ写作社区