Java `Jenkins升级后,类文件的版本错误

Java `Jenkins升级后,类文件的版本错误,java,maven,jenkins,Java,Maven,Jenkins,几天前,我将Jenkins升级到版本1.643。之前,我们使用的是Jenkins1.593。从Jenkins1.612开始,Jenkins需要Java 7,请参阅和。我们的Jenkins服务器有Java8 我有一个由子模块组成的Maven项目。 在Jenkins中的作业配置中,我将构建配置为使用JDK1.6 在构建环境中,它实际上是1.6: JAVA_HOME=/var/lib/jenkins/tools/hudson.model.JDK/1.6 其中一个子模块无法在Jenkins上构建,出现

几天前,我将Jenkins升级到版本
1.643
。之前,我们使用的是Jenkins
1.593
。从Jenkins
1.612开始,Jenkins需要Java 7,请参阅和。我们的Jenkins服务器有Java8

我有一个由子模块组成的Maven项目。 在Jenkins中的作业配置中,我将构建配置为使用JDK1.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
因此,如您所见,它从当前的
$JAVA_HOME
中获取
rt.jar
,因此它可以交叉编译,目标为1.6

我对Java8的起源有点迷茫。在Jenkins升级之前,我们已经在服务器上使用Java8,并以Java6为目标进行交叉编译。我错过了什么

编辑

我需要这个吗?如果我不加评论


${java.home}/lib/rt.jar
pom.xml
中,我仍然可以在桌面上交叉编译,类文件仍然是50.0版

编辑

当我取出那个部件时,构建不再失败。 也就是说我自己解决了


我想把问题改为:为什么它一开始就失败了?为什么在Jenkins 1.593上没有失败呢?

我将我的
pom.xml
更改为这个答案中的描述方式:


org.apache.maven.plugins
maven编译器插件
3.3
1.6
1.6
UTF-8
${java.home}/lib/rt.jar
如你所见:

  • 我显式设置了
    groupId
  • 我明确地将
    版本设置为最新版本,
    3.3
  • 配置
    参数的格式稍有不同

我有根据的猜测是,Jenkins服务器上的Maven没有在
compilerArguments
中获取配置,只有当它直接在
configuration
中时才会感到高兴。我让评论来解释如何以及为什么,但对我来说,问题已经解决了。

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

  • compilerArguments
    。一直都是这样

  • 正如您可以从中看到的,
    编译器参数
    /
    编译器参数
    仅用于配置节本身不支持的参数。由于支持
    bootclasspath
    ,因此在
    compilerArgs
    /
    compilerArguments
    部分中使用它通常是不正确的

  • compilerArgs
    /
    compilerArguments
    仅在以下情况下使用,这不适合您的配置

  • 第三点可能是它不适合你的最重要原因。在用例中使用
    配置
    部分应该没有问题,事实上,根据您的问题/答案,情况似乎是这样的


    还要注意,
    java.home
    不是
    java\u home
    。我在另一个答案中对此进行了扩展。我想这与为什么你会看到詹金斯版本之间的变化有关。

    实际上没有必要在问题和答案上都有相同的内容。选择一个或另一个:)什么?当我还在编辑的时候,你跳了进来。好吧,如果我理解正确的话:我发现的
    $JAVA_HOME
    是Jenkins在开始工作之前就知道的,但不一定与Maven在触发我的问题的事件发生时使用的JRE/JDK相同,因为编译器插件的作用。我可以将我的工作设置为使用JDK1.8构建,将编译器插件设置为使用答案中的配置构建为1.6,并且我仍然拥有一个有效的构建。这是正确的假设吗?很好。这意味着我可以将一些内容移动到父pom,并简化其他pom。不过,首先测试它-可能总会有其他东西干扰它。当然。这就是功能分支的用途!:)@AmedeeVanGasse澄清:您的bootclasspath仍然需要指向以前JDK的rt.jar。因此,虽然可以在JDK1.8上运行它,但仍然需要JDK1.6中的rt.jar,然后指向它。不幸的是。