使用Proguard混淆多版本JAR时遭遇类文件识别警告问题求助
解决ProGuard扫描log4j的META-INF/versions目录类文件的警告问题
我之前也碰到过一模一样的问题,这是因为ProGuard默认会遍历JAR包里的所有类文件,哪怕是META-INF/versions/9这种为Java 9+准备的多版本字节码文件,就算你加了-libraryjars标记依赖库也会触发这个警告。下面是几个亲测有效的解决办法:
方法1:在配置里直接排除META-INF/versions目录
在你的ProGuard配置文件中添加这些规则,跳过对该目录下类的处理:
# 精准屏蔽单个类的警告并保留它 -dontwarn org.apache.logging.log4j.util.ProcessIdUtil -keep class org.apache.logging.log4j.util.ProcessIdUtil { *; } # 或者更通用的方式,排除整个META-INF/versions目录下的所有内容 -keepdirectories !META-INF/versions/**
如果只想针对log4j的JAR做过滤,还可以这么写-libraryjars:
-libraryjars log4j-api-2.10.0.jar(!META-INF/versions/**)
方法2:升级ProGuard版本
你用的6.0.2版本比较旧了,后续的6.2及以上版本已经优化了对多版本JAR(Multi-Release JARs)的处理,默认会忽略META-INF/versions里的高版本类文件,升级之后这个警告基本会自动消失。
方法3:调整log4j版本(可选)
log4j-api-2.10.0是支持Java 9+的多版本JAR,如果你是在Java 8及以下环境打包,ProGuard识别到高版本字节码就会报警告。要是项目对log4j新特性没需求,可以降级到仅支持Java 8的版本(比如2.8.2),不过这个得看项目实际情况权衡。
另外要提醒下,-libraryjars只是告诉ProGuard这些是依赖库不做混淆,但它还是会扫描所有类文件做依赖分析,所以必须加额外规则排除不需要处理的部分才行。
内容的提问来源于stack exchange,提问作者Efi G
相关产品推荐
相关产品推荐

