【问题标题】:`class file has wrong version` after Jenkins upgrade詹金斯升级后`类文件有错误的版本`
【发布时间】:2016-01-18 12:36:28
【问题描述】:

几天前,我将 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

根据我可以谷歌,类文件版本 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 上没有失败?

【问题讨论】:

    标签: java maven jenkins


    【解决方案1】:

    我将我的 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 中时才会感到高兴。我把它留给 cmets 解释如何以及为什么,但对我来说问题已经解决了。

    【讨论】:

    • 确实没有必要在问题和答案上都有相同的内容。选择一个或另一个:)
    • 什么?你在我还在编辑的时候加入了。 :)
    【解决方案2】:

    我认为您的假设存在一些错误。

    1. compilerArgumentsdeprecated。我是superseded by compilerArgs

    2. 就像您从compiler plugin documentation 看到的那样,compilerArguments/compilerArgs 仅用于配置部分本身不支持的参数。由于支持bootclasspath,所以在compilerArgs/compilerArguments部分使用一般是不正确的。

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

    第三点可能是它对您不起作用的最重要原因。在您的用例中使用 configuration 部分应该没有问题,并且确实根据您的问题/答案,情况似乎如此。

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

    【讨论】:

    • 好的,如果我理解正确的话:我发现的$JAVA_HOME 是 Jenkins 了解的 before 它开始工作,但不一定与由于编译器插件的作用,Maven 在触发我的问题的事件发生的确切时刻使用的 JRE/JDK。我可以将我的工作设置为使用 JDK 1.8 构建,将编译器插件设置为使用答案中的配置为 1.6 构建,我仍然会有一个有效的构建。这是一个正确的假设吗?
    • 太棒了。这意味着我可以将一些东西移动到父 pom 并简化其他 pom。
    • 先测试一下 - 可能总会有其他东西干扰它。
    • 当然。这就是功能分支的用途! :)
    • @AmedeeVanGasse 澄清一下:您的引导类路径仍需要指向以前 JDK 的 rt.jar。因此,虽然您可以在 JDK 1.8 上运行它,但您仍然需要 JDK 1.6 中的 rt.jar,然后指向它。不幸的是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2015-05-31
    • 2019-11-11
    相关资源
    最近更新 更多