我一直在 docker 容器中使用 Jenkins(2.289.3)(https://hub.docker.com/r/jenkins/jenkins)。Jenkins 2.312的下一個更新是將docker容器從Java 8遷移到Java 11.
。我有一些管道使用 sourceforge jdbc 驅動程式來查詢 SQL 服務器(http://jtds.sourceforge.net/)
示例:
import java.sql.DriverManager
import groovy.sql.Sql
con = DriverManager.getConnection('jdbc:jtds:sqlserver://servername', 'user', 'password') 。
stmt = con.createStatement()。
為了使這個作業,在Java 8上的Docker容器中,我在docker容器上運行了這個
。cp jtds-1.3。 1.jar ${JAVA_HOME}/jre/lib/ext
該方法加載jar以在Jenkins內部使用。這個方法在Java 11中已經不存在了。
似乎管道已經添加了@Grab語法,例如
@Grab(group='net. sourceforge.jtds', module='jtds', version='1.3.1')
如果我把這個添加到我的管道中,我可以看到Jars被下載到/var/jenkins_home/.groovy/grapes/中,但它似乎并沒有真正加載jar
java.lang.groovy/grapes/中的jar。
java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver。
或者
java.sql.SQLException: 沒有找到適合jdbc:jtds:sqlserver://servername的驅動所有的groovy例子都使用
@GrabConfig(systemClassLoader=true)
但是管道中似乎不支持這種做法。
我曾考慮過使用命令列客戶端,但我需要決議查詢結果,而且我還沒有看到一個能很好地解決這個問題的工具(即一個能將結果加載到json檔案或類似檔案中的工具)
我也曾嘗試過使用命令列客戶端,但我需要決議查詢結果,而且我還沒有看到一個能很好地解決這個問題的工具。
我還嘗試在docker容器中設定-classpath引數,例如
ENV JAVA_OPTS=-classpath /var/jenkins_home/test/jtds-1. 3.1.jar
在 docker 容器中運行 ps,我可以看到 java 行程運行時指定了 classpath 命令列選項,但它似乎沒有實際加載 jar 以供使用。
我對如何實作這一作業有點迷茫,誰能幫幫我?謝謝。
uj5u.com熱心網友回復:
好吧,我已經找到了一個解決方法。它看起來并不理想,但它確實起作用了
原代碼
我找到了一個解決辦法。
原代碼
import java.sql.DriverManager
import groovy.sql.Sql
con = DriverManager.getConnection('jdbc:jtds:sqlserver://servername', 'user', 'password') 。
stmt = con.createStatement()。
假設我們有保存在/var/jenkins_home/test/jtds-1.3.1.jar的jar,它可以被更新為:
import java.sql.DriverManager
輸入groovy.sql.Sql
def classLoader = this.class.classLoader
while (classLoader.parent) {
classLoader = classLoader.father
如果(classLoader.getClass() == java.net.URLClassLoader)
{
//加載我們的jar 進入urlclassloader
classLoader.addURL(new File("/var/jenkins_home/test/jtds-1.3.1.jar").toURI() .toURL())
突破。
}
}
//注冊該類
Class.forName("net.sourceforge.jtds.jdbc.Driver")
con = DriverManager.getConnection('jdbc:jtds:sqlserver://servername', 'user', 'password') 。
stmt = con.createStatement()。
一旦這段代碼被運行一次,該jar似乎就可以被全域訪問(甚至在其他不加載jar的管道中)。
基于此,似乎處理這個問題的好方法是在Jenkins初始化時,而不是在腳本中。我創建了/var/jenkins_home/init.groovy,內容如下:
def classLoader = this.class.classLoader
while (classLoader.parent) {
classLoader = classLoader.father
如果(classLoader.getClass() == java.net.URLClassLoader)
{
classLoader.addURL(new File("/var/jenkins_home/jars/jtds-1.3.1.jar") .toURI().toURL())
突破。
}
}
Class.forName("net.sourceforge.jtds.jdbc.Driver")
在這之后,腳本的行為似乎與我認為它應該在classpath中的Jar中作業的方式相似。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/323133.html
標籤:
