Jenkins升级后,“类文件有错误版本”

时间:2016-01-18 12:36:28

标签: java maven jenkins

几天前,我将Jenkins升级到版本1.643。之前,我们使用的是Jenkins 1.593。从Jenkins 1.612开始,Jenkins需要Java 7,请参阅changelogannouncementissue。我们的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之前没有失败?

2 个答案:

答案 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)

我认为你的假设中有一些错误。

  1. compilerArgumentsdeprecated。它已经superseded by compilerArgs

  2. 您可以从compiler plugin documentation看到,compilerArguments / compilerArgs仅用于配置部分本身不支持的参数。如果支持bootclasspath,则在compilerArgs / compilerArguments部分中使用它通常是不正确的。

  3. compilerArgs / compilerArguments仅在fork is set to true时使用,这对您的配置不正确。

  4. 第三点可能是它不适合你的最重要原因。对于您的用例使用configuration部分应该没有问题,而且实际上基于您的问题/答案,情况似乎就是这样。

    另请注意,java.home 不是 JAVA_HOME。我在另一个答案here上对此进行了扩展。我猜这与你看到Jenkins版本之间的变化的原因有关。