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

Posted

技术标签:

【中文标题】Travis CI 说 JRE 是 11 但仍然不会运行类文件版本 55 的 JAR【英文标题】:Travis CI says JRE is 11 but still won't run JAR of class file version 55 【发布时间】:2021-02-14 02:04:08 【问题描述】:

我有一个连接到 Travis CI 构建的 Python 应用程序。测试运行后,我需要启动应用程序,然后运行一个 JAR 文件来完成测试。 JAR 文件是用 Java 11 编译的,类文件版本为 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.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.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 行,它返回以下内容:

$ 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的输出。 @chrylis-cautiouslyoptimistic- 你说的是sudo java -jar blah-blah-blah 的输出吗?如果是这样,我更新了我的问题以包含整个输出,尽管看起来我遗漏了Error: A JNI error has occurred, please check your installation and try again,尽管这似乎不会对这种情况有很多启示 不,我的意思是你正在运行java -version,但sudo java -jar。这些可能不会产生相同的结果。 【参考方案1】:

sudo 的默认策略通常会出于安全原因清除大量环境变量,并且当您构建应用程序并以正常权限运行 java -version 检查时,您正在使用sudo java 实际运行它。在这两种环境中,您可能会得到不同的 PATH 和/或 JAVA_HOME

【讨论】:

以上是关于Travis CI 说 JRE 是 11 但仍然不会运行类文件版本 55 的 JAR的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Travis CI 自动同意 pip?

在对travis-ci的测试期间,它会挂起

在 travis-ci 上使用秘密 api 密钥

github pages与travis ci运作原理

Travis CI 不使用 pom.xml 中提供的额外 Maven 存储库

无法使用 Travis-CI 运行可执行文件-不确定我做错了啥