Jenkins升级到Java11后Pipeline用jtds查询MS SQL Server失败求助
Jenkins 2.312(Java 11环境)加载jtds JDBC驱动失败解决方案
方案1:Pipeline内手动加载驱动(无需修改容器配置,推荐)
该方案直接在流水线代码中处理类加载逻辑,适配Jenkins Pipeline的类加载机制,不需要修改容器启动参数。
操作步骤:
- 提前将
jtds-1.3.1.jar上传到Jenkins主节点/任务运行节点的固定路径,例如/var/jenkins_home/public_libs/ - 修改你的流水线代码,在调用JDBC逻辑前手动加载jar包并注册驱动,示例代码如下:
import java.sql.DriverManager import groovy.sql.Sql import java.io.File // 手动将jtds jar添加到当前类加载器 this.getClass().getClassLoader().addURL(new File("/var/jenkins_home/public_libs/jtds-1.3.1.jar").toURI().toURL()) // 显式注册JDBC驱动 Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance() // 后续原有逻辑不变 con = DriverManager.getConnection('jdbc:jtds:sqlserver://servername', 'user', 'password'); stmt = con.createStatement();
注意:如果流水线运行在动态Agent上,需要确保Agent镜像中已经预置了对应路径的jtds jar包
方案2:修改Docker镜像配置,使用Java 11扩展路径替代原jre/lib/ext
Java 11移除了原有jre/lib/ext扩展目录,可通过jdk.launcher.ext.path系统属性指定自定义扩展目录,还原Java 8下的加载逻辑:
- 自定义Jenkins Docker镜像,将
jtds-1.3.1.jar内置到固定路径,例如/opt/java_ext_libs/ - 修改容器启动的环境变量,添加系统属性参数:
ENV JAVA_OPTS="-Djdk.launcher.ext.path=/opt/java_ext_libs"
该方案配置一次全局生效,所有流水线都可以直接使用原有JDBC逻辑,无需修改代码。
方案3:改用命令行工具执行查询并解析结果
如果不想修改类加载相关配置,可以使用SQL Server官方命令行工具直接导出JSON格式结果,规避Groovy类加载问题:
- 在Jenkins节点/Agent镜像中安装
sqlcmd工具 - 执行查询时使用SQL Server自带的
FOR JSON语法直接输出JSON格式结果,示例命令:
sqlcmd -S servername -U user -P password -Q "SELECT * FROM 表名 FOR JSON PATH, INCLUDE_NULL_VALUES" -h -1 -y 0 > query_result.json
- 后续在流水线中直接读取
query_result.json文件解析内容即可。
内容的提问来源于stack exchange,提问作者user367341
相关产品推荐
相关产品推荐

