You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动