如何输出不同JDK版本jar包

背景

一个应用在编译war包时忽然报错,提示编译失败,原因是编译Java版本低于依赖的jar包版本,详细报错如下:

 bad class file: com/xx/xx/xx/xxDO.class(xx.class)
class file has wrong version 52.0, should be 50.0;

由于是旧应用,直接升级到新版本的JDK上不现实,经过确认JDK兼容性原则:

Java SE 8 is binary-compatible with Java SE 7 except for the incompatibilities listed below. Except for the noted incompatibilities, class files built with the Java SE 7 compiler will run correctly in Java SE 8. Class files built with the Java SE 8 compiler will not run on earlier releases of Java SE.

JDK版本只具备向上兼容性,在JDK1.7的虚拟机无法加载JDK1.8及以上编译的class文件,反过来则是可以的

则在此约束下确定该问题解决方案需要输出一个jdk1.6编译的class

方案1:安装JDK1.6及对应Maven环境

需要JDK1.6的编译,直接的想法就是给开发环境装载一套1.6的jdk + 支持1.6jdk 的 maven

配置开发环境多版本JDK

下载JDK1.6,建议直接到Oracle官方下载,MAC用户可以直接点链接下载,然后按照步骤安装即可;
安装完成之后需要设置JAVA_HOME指向对应版本的的路径地址

export JAVA_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/

另如果是MAC环境建议直接安装 jenv

# 安装 jenv
brew install jenv
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile

# 常用命令
jenv add # 新增JVM环境
jenv versions # 查询已安装JVM环境
jenv local 1.6 # 切换Java版本

安装Maven环境

  • 1、下载Maven并解压:特殊注意这里需要Maven3.2.5之前的版本
  • 2、配置Maven环境变量
export M2_HOME=/usr/xx/maven/maven2
export PATH=$M2_HOME/bin:$PATH

这里要特殊注意Maven版本的问题,Maven3.2.5之后的版本是以JDK1.7编译的,此时无法顺利执行mvn命令;关于Maven本身兼容性可以在点此查看

验证环境

# 此时执行 mvn -v
➜  ~ mvn -v
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:23+08:00)
Maven home: /Users/pure/tools/maven-325
Java version: 1.6.0_65, vendor: Apple Inc.
Java home: /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: zh_CN, platform encoding: EUC_CN
OS name: "mac os x", version: "10.14.5", arch: "x86_64", family: "mac"

看到上述配置即可编译对应JDK1.6版本class文件

【推荐】 方案2:通过Maven compile插件配置

Sometimes when you may need to compile a certain project to a different version than what you are currently using. The javac can accept such command using -source and -target. The Compiler Plugin can also be configured to provide these options during compilation.

For example, if you want to use the Java 8 language features (-source 1.8) and also want the compiled classes to be compatible with JVM 1.8 (-target 1.8), you can either add the two following properties, which are the default property names for the plugin parameters:

如上述可以通过修改pom参数中,source 和 target参数来指定编译和输出的版本号


  [...]
  
    1.8
    1.8
  
  [...]


# 或


  [...]
  
    [...]
    
      
        org.apache.maven.plugins
        maven-compiler-plugin
        3.8.1
        
          1.8
          1.8
        
      
    
    [...]
  
  [...]

通过修改mvn配置,重新deploy极有可能不生效;Maven deploy命令主要是执行Compiling、javac、install、deploy过程,在此过程中编译的class文件极有可能存在缓存导致并未更新;故反复deploy也无法得到指定版本的class文件

验证class文件的版本

class 本身是二进制文件,可以通过二进制编辑器或者在Mac环境下通过hexdump打开,打开后如下:

➜  ~ hexdump -C /xxxx/TestDO.class
00000000  ca fe ba be 00 00 00 32  00 51 0a 00 11 00 3b 0a  |.......2.Q....;.|
00000010  00 3c 00 3d 09 00 10 00  3e 09 00 10 00 3f 09 00  |.<.=....>....?..|

# 其中前四个字节固定 ca fe ba be  ,接下来的四个字节为次版本号(0000)和主版本号(0032)-> JDK 1.6
#34->JDK1.8;
#33->JDK1.7;
#32->JDK1.6

另外一种验证方式可以通过javap

javap -verbose TestDO.class

备注

Maven&JDK兼容表

maven3-jdk兼容对比表.png

最后感谢下Google,大部分信息来自Google的帮助

你可能感兴趣的:(如何输出不同JDK版本jar包)