有时候项目中需要对模块指定JDK打包,下面会介绍如何利用Idea指定打包的JDK版本,以及如何判断Jar的jdk版本
1、Idea打包时指定JDK的版本
如果需要修改整个项目的JDK版本进行打包,如下图,选择对应的JDK版本
2、打包多模块项目指定单个模块的JDK版本
多模块的项目中,如果需要修改某一个模块的JDK版本,可以在模块的pom文件中,增加如下配置,然后进行打包即可,例如整体项目的JDK是11,但是想修改其中某一个模块为JDK8
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
注意:只修改pom文件,打出的Jar包中的MANIFEST.MF文件中的Build-Jdk字段的显示可能不准,就是可能显示的第1节中的Idea中设置的版本,但是jar实际的字节码版本是对的。
可以既修改pom文件又修改项目的打包JDK版本,使两者保持一致
3、判断jar的版本
有以下4种方式来判断Jar的JDK版本
方式一:解压Jar包,查看/META-INF/MANIFEST.MF文件中的Build-Jdk字段,如下图,优点是可以很快的确认Jar的版本,缺点是不准确,但是大部分情况下是准确的,和制作者的打包方式有关。
Build-Jdk表示的不是编译的JDK版本,例如用Idea打包时,就是项目的JDK版本,如目录一中的图所示。
方式二:将Jar包用Idea工具打开,查看其class文件,Idea会提示当前class文件编译的JDK版本。
具体方式是,将要查看的Jar,放入一个文件夹内,使用Idea打开这个文件夹,选择文件夹内的Jar,右键选择Add as Library,如下图
然后打开Jar包内,任意一个class文件,会显示当前Jar的字节码版本以及对应的编译的JDK版本,如下图
方式三:可以使用本地JDK自带的工具javap,解压Jar包后,查看其中某一个class的版本,在cmd命令窗口,敲如下指令
javap -v E:\project\test.class
执行结果开头,可以看到如下图,major version即为字节码的版本
Majar Version与Jdk版本对应关系,JDK1对应45,JDK2对应46,两者依次加一,以此类推:JDK8对应52,JDK17对应61
方式四:将Jar包解压后,拿到其中任意一个class文件,浏览器搜索 在线二进制文件16进制查看,选择任意一个进入 (在线二进制文件查看器 (markbuild.com)),上传文件可以看到如下:
如上图所示,37的16进制,转换成十进制,就是3×16+7 = 55,按照上面的Majar Version与Jdk版本对应关系,55-44 = 11,则是JDK11