如何在Jenkins Pipeline文件夹级共享库中引入Jar包(非JDK lib/ext方式)
在Jenkins Pipeline共享库中添加Jar包到类路径的解决方案
先明确下你的问题背景:
官方文档说明:src目录应遵循标准Java源码目录结构,执行Pipeline时该目录会被加入类路径。
但实际在该目录下放Jar包或class文件时,这个描述并不准确。我搭建了最新版本的Jenkins Pipeline实例,在Jenkinsfile中尝试从隐式加载的文件夹级共享库导入类时,出现类加载错误。想咨询:有没有办法将Jar包加入Pipeline的类路径,使其类可被调用?而且我不想把Jar包放到Jenkins所用JDK/JRE的lib/ext目录。
下面给你几个实用的解决办法,都是不用动JDK/JRE目录的:
方法一:写个Groovy工具类手动加载Jar
你可以在共享库的src目录下创建一个专门的类来处理Jar加载,比如在src/com/yourteam/utils/JarLoader.groovy里写这段代码:
package com.yourteam.utils class JarLoader { static void loadJar(String jarPath) { def jarFile = new File(jarPath) if (jarFile.exists()) { // 把Jar添加到根类加载器的路径中 this.class.classLoader.rootLoader.addURL(jarFile.toURI().toURL()) } else { throw new FileNotFoundException("找不到指定的Jar包:${jarPath}") } } }
然后在你的Jenkinsfile里这么用:
@Library('你的共享库名称') _ import com.yourteam.utils.JarLoader pipeline { agent any stages { stage('加载Jar包') { steps { script { // 这里可以写Jar包在工作区的路径,或者共享库内的绝对路径 JarLoader.loadJar("${env.WORKSPACE}/libs/your-business.jar") // 现在就能正常导入和使用Jar里的类了 import com.yourcompany.business.YourService def service = new YourService() service.processTask() } } } } }
方法二:利用共享库的resources目录加载内置Jar
如果你的Jar包是共享库的一部分,直接把它放到共享库的resources/libs目录下(没有就新建),然后用libraryResource方法把Jar读取到工作区再加载:
@Library('你的共享库名称') _ pipeline { agent any stages { stage('加载共享库内置Jar') { steps { script { // 从共享库的resources目录读取Jar,转成Base64写入本地文件 writeFile file: 'temp-business.jar', text: libraryResource('libs/your-business.jar'), encoding: 'Base64' // 加载Jar到类路径 def jarUrl = new File('temp-business.jar').toURI().toURL() this.class.classLoader.rootLoader.addURL(jarUrl) // 使用Jar中的类 import com.yourcompany.business.YourService def service = new YourService() service.processTask() } } } } }
注意事项
- 要是用的是分布式Jenkins,得确保所有代理节点都能访问到Jar包——要么把Jar打包进共享库,要么存在所有节点都能访问的共享存储里
- 加载Jar的操作要在使用类之前执行,别提前引用导致类找不到
- 要保证Jenkins代理节点对Jar文件路径有读取权限
内容的提问来源于stack exchange,提问作者6cef




