【问题标题】:Problem using external jar in Jenkins Shared Library在 Jenkins 共享库中使用外部 jar 的问题
【发布时间】:2018-11-06 23:32:11
【问题描述】:

我们正在使用 Jenkins 共享库来集中我们所有(脚本化的)管道的一些代码。现在我们将一些 Groovy 代码分解为 .jar 库(用 Kotlin 编写,编译为与 Java 8 兼容)。我们将此库发布到我们的内部 maven 存储库,现在想在我们的共享库中使用它。

我们使用@Grab 来加载我们的库,直到那时它就像一个魅力。然而,我们得到了NoSuchMethodError's。我们确定了一点,我们在 Kotlin 库中使用了 OkHttp。 OkHttp 内部使用 Okio。当我们从管道调用内部调用 OkHttp-Code 的方法时,一切都很好。然而,当 OkHttp-Code 在内部调用 Okio 时,我们会得到一个 NoSuchMethodError。

我们已经检查了发布的.jar 文件,它包含带有似乎缺少方法的类。有人知道问题可能是什么吗?

虽然我们这样做了,但我们无法访问在 Kotlin 库中设置在 Jenkins 上的环境变量,有什么方法可以解决这个问题吗?

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-shared-libraries


    【解决方案1】:

    我们想通了。问题是,Jenkins 插件在内部使用了旧版本的okio。因为插件和共享库以某种方式共享相同的类路径,okio 没有被加载并且插件的版本被使用,因此该类不存在。

    我们通过重新打包 .jar 中的所有依赖项来解决此问题,因此包名称不会干扰,并且我们可以确保正在使用我们指定的依赖项。

    【讨论】:

      【解决方案2】:

      看这里的依赖你有几个问题:

      1. OKHttp - 似乎期待一些 Android 库
      2. okio - 取决于 Kotlin 运行时

      对这些的任何调用都将导致方法未找到错误,除非您找到一种方法使它们可用而不会在 Jenkins 中引起问题

      【讨论】:

      • OkHttp 不包含任何类型的 android 特定代码 afaik。另外,我们的 lib 也使用 Kotlin,所以 Kotlin 运行时应该可用,不是吗?
      • 所以 android 的东西“可能”不是问题,但如果我没记错的话,Kotlin 库是“提供”的依赖项,比如 JDK。 Java 安排 JDK 可用于您正在运行的 Java 应用程序,但我很确定 Kotlin 运行时不会可用于在 Jenkins 中运行的代码......
      • 如果是这样的话,第一个语句就会失败,对吧?因为之前的(仅限 Kotlin)语句只是 find,所以失败的只是库调用。
      • 由于它是一个库,这将是您的代码第一次调用 Kotlin 特定的运行时。由于您收到 NoSuchMethod 异常,方法名称是否有助于区分未加载的类?
      • 是的,它在ByteStream.encodeString 抱怨,这是Okio 的第一个调用(但不是OkHttp 的第一个)
      猜你喜欢
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      相关资源
      最近更新 更多