【发布时间】:2016-01-18 12:36:28
【问题描述】:
几天前,我将 Jenkins 升级到了 1.643 版本。之前,我们使用 Jenkins 1.593。从 Jenkins 1.612 开始,Jenkins 需要 Java 7,请参阅 changelog、announcement 和 issue。我们的 Jenkins 服务器有 Java 8。
我有一个由子模块组成的 Maven 项目。 在 Jenkins 的作业配置中,我已将构建配置为使用 JDK 1.6。
看编译环境,确实是1.6:
JAVA_HOME=/var/lib/jenkins/tools/hudson.model.JDK/1.6
其中一个子模块无法在 Jenkins 上构建,出现以下错误:
[ERROR] /var/lib/jenkins/<REDACTED>.java:[15,-1] cannot access java.lang.Object
bad class file: java/lang/Object.class(java/lang:Object.class)
class file has wrong version 52.0, should be 50.0
根据我可以谷歌,类文件版本 52.0 是 JDK 1.8,而编译器期望版本 50.0,即 JDK 1.6。我假设类文件 52.0 引用 rt.jar(Java 运行时),其中包含 java.lang.Object(另请参阅下面的 pom.xml sn-p)。
我找到了this SO question(以及其他重复的),但它们都是在某人从他们的 IDE(IntelliJ)或命令提示符构建的上下文中,在阅读它们之后,我没有看到我如何应用建议的解决方案。它们涉及设置$JAVA_HOME,这已由 Jenkins 完成。
我的问题有所不同,因为问题出在 Jenkins(和 Maven)的上下文中,并且仅在 Jenkins 升级后发生。当我在自己的桌面(使用 JDK 1.8)上执行 mvn clean install 时,不会发生错误。如果我在有问题的类文件上执行file 命令,但在编译成功的桌面上,我得到compiled Java class data, version 50.0 (Java 1.6)。对我来说,这证实了我的 pom.xml (可能)仍然正确,并且它(可能)是 Jenkins 配置问题。
该特定子模块在pom.xml 中有这个,可能相关也可能不相关:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArguments>
<verbose />
<bootclasspath>${java.home}/lib/rt.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
</plugins>
</build>
因此,如您所见,它从当前的 $JAVA_HOME 中获取了 rt.jar,因此它可以与目标 1.6 交叉编译。
我对这个 Java 8 的起源有点迷茫。在 Jenkins 升级之前,我们已经在服务器上使用 Java 8 并与 Java 6 的目标进行交叉编译。我在这里缺少什么?
编辑
我什至需要这个吗?如果我注释掉
<compilerArguments>
<verbose />
<bootclasspath>${java.home}/lib/rt.jar</bootclasspath>
</compilerArguments>
在pom.xml,我仍然可以在我的桌面上交叉编译,并且类文件仍然是50.0版本。
编辑
当我取出那部分时,构建不再失败。 这意味着我自己解决了。
我想把问题改成:为什么一开始就失败了?为什么之前在 Jenkins 1.593 上没有失败?
【问题讨论】: