在 Jenkins 共享库中使用外部 jar 时出现问题
Problem using external jar in Jenkins Shared Library
我们正在使用 Jenkins 共享库来集中所有(脚本化)管道的一些代码。现在我们将一些 Groovy 代码提取到 .jar
库中(用 Kotlin 编写,编译为 Java 8 兼容)。我们将这个库发布到我们的内部 Maven 存储库,现在想在我们的共享库中使用它。
我们正在使用 @Grab
来加载我们的库,直到那时它才像魅力一样发挥作用。但是我们得到了 NoSuchMethodError
。我们将其精确定位了一点,我们在 Kotlin 库中使用了 OkHttp。 OkHttp 内部使用 Okio。当我们调用从管道内部调用 OkHttp-Code 的方法时,一切都很好。然而,当 OkHttp-Code 在内部调用 Okio 时,我们得到一个 NoSuchMethodError
.
我们已经检查了已发布的 .jar
文件,它包含 类 以及似乎缺失的方法。有人知道问题出在哪里吗?
虽然我们在这里,但我们无法访问在 Kotlin 库中的 Jenkins 上设置的环境变量,有没有办法解决这个问题?
查看这里的依赖你有一些问题:
- OKHttp - 似乎需要一些 Android 库
- okio - 取决于 Kotlin 运行时
对这些的任何调用都将导致方法未找到错误,除非您找到一种方法使它们可用而不会在 Jenkins 中引起问题
我们想通了。问题是,Jenkins 插件在内部使用了旧版本的 okio
。因为插件和共享库以某种方式共享相同的 class 路径,okio
没有被加载并且使用了插件的版本,因此 class 不存在。
我们通过重新打包 .jar
中的所有依赖项来修复此问题,因此包名称不会干扰,我们可以确保使用指定的依赖项。
我们正在使用 Jenkins 共享库来集中所有(脚本化)管道的一些代码。现在我们将一些 Groovy 代码提取到 .jar
库中(用 Kotlin 编写,编译为 Java 8 兼容)。我们将这个库发布到我们的内部 Maven 存储库,现在想在我们的共享库中使用它。
我们正在使用 @Grab
来加载我们的库,直到那时它才像魅力一样发挥作用。但是我们得到了 NoSuchMethodError
。我们将其精确定位了一点,我们在 Kotlin 库中使用了 OkHttp。 OkHttp 内部使用 Okio。当我们调用从管道内部调用 OkHttp-Code 的方法时,一切都很好。然而,当 OkHttp-Code 在内部调用 Okio 时,我们得到一个 NoSuchMethodError
.
我们已经检查了已发布的 .jar
文件,它包含 类 以及似乎缺失的方法。有人知道问题出在哪里吗?
虽然我们在这里,但我们无法访问在 Kotlin 库中的 Jenkins 上设置的环境变量,有没有办法解决这个问题?
查看这里的依赖你有一些问题:
- OKHttp - 似乎需要一些 Android 库
- okio - 取决于 Kotlin 运行时
对这些的任何调用都将导致方法未找到错误,除非您找到一种方法使它们可用而不会在 Jenkins 中引起问题
我们想通了。问题是,Jenkins 插件在内部使用了旧版本的 okio
。因为插件和共享库以某种方式共享相同的 class 路径,okio
没有被加载并且使用了插件的版本,因此 class 不存在。
我们通过重新打包 .jar
中的所有依赖项来修复此问题,因此包名称不会干扰,我们可以确保使用指定的依赖项。