java - 在两个 centos 7.1 系统上使用 Oracle JDK 1.8.0_60 时,一个 Jenkins slave 无法使用 NoClassDefFoundError 收集工件

标签 java jenkins centos jenkins-slave

给我谜语:

运行 Oracle JDK 1.8 u60 Java 的两个几乎完全相同的 jenkins slave 怎么可能一个无法收集带有 classdef 错误的工件而另一个正常?在这两种情况下,以下是相同的

  • jenkins显示的系统信息
  • 引导类路径
  • jdk
  • jdk 文件(这些文件是使用 SVN 部署的,因此我们知道它们是相同的)
  • 已安装 yum(主要见下文)

注意 我可以通过转到脚本控制台并运行以下命令来复制它

import org.apache.tools.ant.Location
Location l = new Location()

在好的方面工作,在坏的方面以与真正的构建相同的方式失败。

错误

java.io.IOException: remote file operation failed:... at 
hudson.remoting.Channel@35f2fb2:linengbld50: java.io.IOException: 
Remote call on linengbld50 failed
...
Caused by: java.io.IOException: Remote call on linengbld50 failed
...
Caused by: java.lang.NoClassDefFoundError: Could not initialize class
 org.apache.tools.ant.Location
...

百胜差异

好与坏

  • hiera.noarch 1:1.3.4-5 对比 1.3.4-1
  • net-snmp-* 1:5.7.2-24.el7_2.1 对比 1:5.7.2-24.el7
  • ruby-augeas 0.5.0-1 与 0.4.1-3
  • zabbix 2.4.8 与 2.4.7

只有坏

  • python-chardet.noarch 2.2.1-1.el7_1
  • python-kitchen.noarch 1.1.1-5.el7
  • lsof
  • yum-utils.noarch 1.1.31-34.el

最佳答案

使用脚本控制台是一个很好的调试工具,因为它在正确的环境中执行。在每个节点上获取 which java 的输出显示出差异。 @mmasi 发现 bad 显示路径,而 good 返回 null。

即使我们使用特定的 JDK java 运行 slave,它也会使用在路径上找到的第一个 java 来进行其 Activity (归档)。

  • 修改备选方案以将 java 设置为 1.8 (centos)

    sudo alternatives --install/usr/bin/java java\ /opt/tools/Java/jdk1.8.0_60/bin/java 1;java -version

  • 断开并重新连接节点(重启从机)

  • 重复小脚本控制台检查OK

  • 重复构建测试(归档文件的微型构建)OK

关于java - 在两个 centos 7.1 系统上使用 Oracle JDK 1.8.0_60 时,一个 Jenkins slave 无法使用 NoClassDefFoundError 收集工件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37489880/

相关文章:

java - 具有泛型的消费者

java - RESTFul Web 服务 POST 示例

c++ - 构建 Boost 动态可链接会导致链接错误?

apache - 如何将域重定向到 https 并添加默认语言

java - Hibernate 总是运行冗余查询

java - 如何通过 java 代码将 java HashMap 转换为不可变的 Scala 映射?

jenkins - Jenkins无法在macOS 10.12(Sierra)上启动

docker - 启动容器 Jenkins 后,权限被拒绝

linux - 为什么我的服务器总是在文件夹权限中自动更改?

docker - docker 中的容器正在启动,但在 "docker ps"命令中找不到