如何验证应用类文件与Jar包为Java 8编译?如何检测Uber Jar内Java版本?
扫描Uber Jar中类文件的Java编译版本方案
一、用JDK自带javap批量扫描
类文件的major version字段对应编译时的Java版本:Java 8对应52.0,Java 11对应55.0。通过以下命令批量检测Uber Jar里的所有类:
# 先把Uber Jar解压到临时目录 unzip your-uber.jar -d temp-classes # 遍历所有.class文件,提取版本信息并去重统计 find temp-classes -name "*.class" -exec javap -verbose {} \; | grep "major version" | sort | uniq -c
执行后会输出不同版本的出现次数,能快速发现是否存在高于Java 8的类。
二、用jdeps快速检测(JDK 8及以上可用)
jdeps是JDK自带的依赖分析工具,可直接扫描Jar包输出类的版本信息,命令更简洁:
# 直接扫描Jar包,过滤出版本信息 jdeps -verbose:class your-uber.jar | grep "major version"
如果要更清晰的统计结果,结合awk处理:
jdeps -verbose:class your-uber.jar | awk '/major version/ {print $NF, $(NF-2)}' | sort | uniq -c
三、Maven打包前提前拦截
如果用Maven打包Uber Jar(比如使用maven-shade-plugin),可以用maven-enforcer-plugin在打包阶段就检查所有依赖的编译版本,避免事后排查。在pom.xml中添加配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <id>check-java-version</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <requireJavaVersion> <!-- 限定依赖编译版本为Java 8 --> <version>[1.8,1.9)</version> <message>依赖编译版本不能超过Java 8!</message> </requireJavaVersion> </rules> </configuration> </execution> </executions> </plugin>
打包时如果有依赖的编译版本高于Java 8,插件会直接报错终止打包。
四、第三方工具ClassVerifier
有专门的轻量工具ClassVerifier,下载后直接运行:
java -jar classverifier.jar your-uber.jar -target 1.8
它会自动列出所有不符合Java 8版本要求的类文件,结果直观清晰。
内容的提问来源于stack exchange,提问作者PatS
相关产品推荐
相关产品推荐

