【jar】Java Runtime recognizes class file versions up to 52.0

2022-07-28,,

UI自动化平台二次开发开源项目 daxiang agent 做为设备连接和任务执行的agent模块

开始使用时服务部署在windows环境,但是发现在两台设备连接并使用时cpu直接打满,故考虑将服务部署在一台18c的linux设备,并针对性的优化性能

在linux中安装java8、appiun环境后,在mac中打包,并运行 java -jar agent.5.0.jar,发现在执行用例时抛出异常如下:

核心的报错信息

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/apksigner/ApkSignerTool has been compiled 
by a more recent version of the Java Runtime (class file version 53.0), this version of the Java Runtime only recognizes class file 
versions up to 52.0

class file versions up to 52.0,看看具体版本以及对应的java版本

49 = Java 5
50 = Java 6
51 = Java 7
52 = Java 8
53 = Java 9
54 = Java 10
55 = Java 11
56 = Java 12
57 = Java 13
58 = Java 14

故已经使用Java版本9编译了代码,而当前的是版本8

是否因为mac打包时使用的是高于java8的版本进行,故设置java打包的依赖的JRE版本为1.8

重新maven打包后部署运行,仍一样的报错

还是版本依赖的问题,那是否因为project中设置Java 编译的原因导致?
在IntelliJ IDEA -> Preferences -> Build -> Java Compiler中将bytecode version降级为8

重新maven打包后部署运行,仍一样的报错,有些泪崩

既然还是打包版本和依赖版本的问题,那么在linux系统直接打包并运行 mvn clean package -Dmaven.test.skip=true

执行在linux环境的jar,依旧相同的错误

那有可能并不是agent服务打包依赖的java版本的问题,再看看详细报错信息和处理逻辑

首先AppiumDriver在创建 createSession 时抛的异常

定位到 apk-signing.js 源码,此时在获取apkSignerForOs

再往上

2020-11-11 23:18:49.768  INFO 2103 --- [c Stream Pumper] com.daxiang.utils.Terminal               : [<==][debug] [BaseDriver] Event 'newSessionStarted' logged at 1605154729767 (23:18:49 GMT-0500 (北美东部标准时间))
2020-11-11 23:18:49.817  INFO 2103 --- [c Stream Pumper] com.daxiang.utils.Terminal               : [<==][debug] [MJSONWP] Encountered internal error running command: Error: Cannot verify the signature of '/root/.nvm/versions/node/v14.15.0/lib/node_modules/appium/node_modules/_appium-uiautomator2-server@4.16.0@appium-uiautomator2-server/apks/appium-uiautomator2-server-v4.16.0.apk'. Original error: Error: A JNI error has occurred, please check your installation and try again
2020-11-11 23:18:49.817  INFO 2103 --- [c Stream Pumper] com.daxiang.utils.Terminal               : [<==][debug] [MJSONWP] Exception i

即android 的com/android/apksigner/ApkSignerTool进行 appium-uiautomator2-server-v4.16.0.apk 包signer处理时提示版本问题

再往上

Using 'apksigner.jar' from '/opt/androidsdk/android-sdk-linux/build-tools/30.0.0-preview/lib/apksigner.jar'

由这个文件处理的结果,解压后发现依赖的java版本是53

进入文件/opt/androidsdk/android-sdk-linux/build-tools/, 依赖的是 30.0.0-preview 此时安装的android-sdk的版本是30,通过翻墙重新下载了版本29

更换android-sdk后,问题解决

本文地址:https://blog.csdn.net/lluozh2015/article/details/109631128

《【jar】Java Runtime recognizes class file versions up to 52.0.doc》

下载本文的Word格式文档,以方便收藏与打印。