Travis CI 说 JRE 是 11 但仍然不会 运行 class 文件版本 55 的 JAR

Travis CI says JRE is 11 but still won't run JAR of class file version 55

我有一个连接到 Travis CI 构建的 Python 应用程序。在测试 运行 之后,我需要启动应用程序,然后 运行 一个 JAR 文件来完成测试。 JAR 文件是用 Java 11 编译的,文件版本是 class 55。在我的构建中,出现以下异常:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/myApp/main/Main has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
    at java.net.URLClassLoader.access0(URLClassLoader.java:74)
    at java.net.URLClassLoader.run(URLClassLoader.java:369)
    at java.net.URLClassLoader.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)

编辑:添加了例外的其余部分

要检查 Travis 实例中的 Java 版本,我有一个 java -version 行 returns 以下内容:

$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

那么为什么异常表现得像 Travis 实例运行宁一个早期版本的 Java?我在本地遇到了同样的问题,并且能够通过将我的 JRE 从 Java 8 更改为 11 来修复它,之后再也没有遇到任何问题。 java -version 命令是否没有像我想的那样告诉我 JRE 版本?有没有办法可以使用 .travis.yml 文件更改 Travis 实例的 JRE?

如有必要,这里是.travis.yml的相关部分:

after_script:
  - chmod +x ~/build.sh
  - chmod 777 ./tests/LPT/myApp.jar
  - bash ~/build.sh
  - java -version # output of this is shown in question
  - sudo java -jar ./tests/LPT/myApp.jar ./tests/LPT/input.json 
^ Last line triggers the exception shown in question
出于安全原因,

sudo 的默认策略通常会清除大量环境变量,而当您 构建 您的应用程序并 运行 宁您的 java -version 检查正常权限,您正在使用 sudo java 实际上 运行 它。在这两种环境中,您可能会得到不同的 PATH and/or JAVA_HOME