几天前,我将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
根据Google的说法,类文件版本52.0是JDK 1.8,而编译器期望版本50.0,即JDK 1.6。我假设类文件52.0引用包含rt.jar
的{{1}}(Java运行时)(另请参阅下面的java.lang.Object
代码段)。
我找到了this SO question(以及其他与之重复的内容),但它们都是在他们的IDE(IntelliJ)或命令提示符下建立某个人的环境中,在阅读之后,我不知道看看我如何应用建议的解决方案。它们涉及设置pom.xml
,这已由Jenkins完成。
我的问题不同,因为问题出在Jenkins(和Maven)的背景下,并且只发生在Jenkins升级之后。当我在自己的桌面上执行$JAVA_HOME
(使用JDK 1.8)时,不会发生错误。如果我在违规类文件上执行mvn clean install
命令,但在编译成功的桌面上,我得到file
。对我来说,这证实我的compiled Java class data, version 50.0 (Java 1.6)
(可能)仍然是正确的,并且(可能)是Jenkins配置问题。
该特定子模块在pom.xml
中具有此功能,可能相关也可能不相关:
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>
开始需要rt.jar
,因此它可以使用1.6的目标进行交叉编译。
我对这个Java 8的起源有点迷茫。在Jenkins升级之前,我们已经在服务器上使用Java 8并与Java 6的目标进行交叉编译。我在这里缺少什么?
修改
我是否需要这个?如果我发表评论
$JAVA_HOME
在 <compilerArguments>
<verbose />
<bootclasspath>${java.home}/lib/rt.jar</bootclasspath>
</compilerArguments>
中,我仍然可以在桌面上交叉编译,类文件仍然是版本50.0。
修改
当我拿出那部分时,构建不再失败。 这意味着我自己解决了。
我想将问题更改为:为什么首先失败了?为什么詹金斯1.593之前没有失败?
答案 0 :(得分:0)
我将pom.xml
改为完全在此SO答案中对其进行了描述:Maven release plugin: specify java compiler version
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
<bootclasspath>${java.home}/lib/rt.jar</bootclasspath>
</configuration>
</plugin>
</plugins>
</build>
如你所见:
groupId
version
设置为最新版本3.3
configuration
参数的格式有点不同。我有根据的猜测是Jenkins服务器上的Maven没有在compilerArguments
内获取配置,只有当它直接位于configuration
内时才会感到高兴。我把它留给评论来解释如何以及为什么,但对我来说问题已经解决了。
答案 1 :(得分:0)
我认为你的假设中有一些错误。
compilerArguments
是deprecated。它已经superseded by compilerArgs
。
您可以从compiler plugin documentation看到,compilerArguments
/ compilerArgs
仅用于配置部分本身不支持的参数。如果支持bootclasspath
,则在compilerArgs
/ compilerArguments
部分中使用它通常是不正确的。
compilerArgs
/ compilerArguments
仅在fork
is set to true
时使用,这对您的配置不正确。
第三点可能是它不适合你的最重要原因。对于您的用例使用configuration
部分应该没有问题,而且实际上基于您的问题/答案,情况似乎就是这样。
另请注意,java.home
不是 JAVA_HOME
。我在另一个答案here上对此进行了扩展。我猜这与你看到Jenkins版本之间的变化的原因有关。