Java 为什么Python的类路径失败了,而RazorSQL却在工作?
在Windows Server 2016上,我们正在尝试使用Jython脚本通过JDBC进行连接,但出现以下错误: java.lang.ClassNotFoundException:java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver 同一台机器上的RazorSQL使用以下设置进行连接,不会出错:Java 为什么Python的类路径失败了,而RazorSQL却在工作?,java,python,sql-server,jython,windows-server-2016,Java,Python,Sql Server,Jython,Windows Server 2016,在Windows Server 2016上,我们正在尝试使用Jython脚本通过JDBC进行连接,但出现以下错误: java.lang.ClassNotFoundException:java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver 同一台机器上的RazorSQL使用以下设置进行连接,不会出错: Driver Class: com.microsoft.sqlserver.jdbc.SQLSe
Driver Class: com.microsoft.sqlserver.jdbc.SQLServerDriver
Driver Location: \Program Files (x86)\RazorSQL\drivers\sqlserver\sqljdbc.jar
因此,我们使用以下命令将类路径设置到相同的位置:
set CLASSPATH=C:\Program Files (x86)\RazorSQL\drivers\sqlserver\sqljdbc.jar
…但是当运行下面的代码时-我们仍然会得到相同的ClassNotFound错误
这是我们的Python代码:
jclassname = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
database = "our_database_name"
db_elem = ";databaseName={}".format(database) if database else ""
host = "###.##.###.###" # ip address
port = "1433"
user = "user_name"
password = "password"
url = (
jdbc:sqlserver://{host}:{port}{db_elem}"
";user={user};password={password}".format(
host=host, port=port, db_elem=db_elem,
er=user, password=password)
)
print url
driver_args = [url]
jars = None
libs = None
db = jaydebeapi.connect(jclassname, driver_args, jars=jars,
libs=libs)
这就是我们运行Python脚本的方式:
C:\jython2.7.0\bin\jython.exe C:\path_to_our_script.py
RazorSQL如何连接良好?但Python却无法连接?如何删除这个类路径错误 您必须在运行时使用系统类加载器加载JAR 请参考答案 以下代码片段取自Gist
def loadJar(jarFile):
''在运行时使用系统类加载器加载jar(JDBC需要)
改编自http://forum.java.sun.com/thread.jspa?threadID=300557
作者:Steve(SG)Langer 2007年1月将上述Java翻译成Jython
参考:https://wiki.python.org/jython/JythonMonthly/Articles/January2007/3
作者:seansummers@gmail.comjython-2.5.3b3的简化和更新+
>>>loadJar('jtds-1.3.1.jar')
>>>从java导入语言,sql
>>>lang.Class.forName('net.sourceforge.jtds.jdbc.Driver')
>>>sql.DriverManager.getDriver('jdbc:jtds://server')
jTDS 1.3.1
'''
从java导入io、net、lang
u=io.File(jarFile).toURL()如果类型(jarFile)net.URL else jarFile
m=net.URLClassLoader.getDeclaredMethod('addURL',[net.URL])
m、 可访问=1
m、 调用(lang.ClassLoader.getSystemClassLoader(),[u])
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
进口医生测试
doctest.testmod()
再看看-Brilliant-这似乎让我们克服了错误。现在转到jaydebeapi.connect的“第一个参数不能强制为字符串”错误。
def loadJar(jarFile):
'''load a jar at runtime using the system Classloader (needed for JDBC)
adapted from http://forum.java.sun.com/thread.jspa?threadID=300557
Author: Steve (SG) Langer Jan 2007 translated the above Java to Jython
Reference: https://wiki.python.org/jython/JythonMonthly/Articles/January2007/3
Author: seansummers@gmail.com simplified and updated for jython-2.5.3b3+
>>> loadJar('jtds-1.3.1.jar')
>>> from java import lang, sql
>>> lang.Class.forName('net.sourceforge.jtds.jdbc.Driver')
<type 'net.sourceforge.jtds.jdbc.Driver'>
>>> sql.DriverManager.getDriver('jdbc:jtds://server')
jTDS 1.3.1
'''
from java import io, net, lang
u = io.File(jarFile).toURL() if type(jarFile) <> net.URL else jarFile
m = net.URLClassLoader.getDeclaredMethod('addURL', [net.URL])
m.accessible = 1
m.invoke(lang.ClassLoader.getSystemClassLoader(), [u])
if __name__ == '__main__':
import doctest
doctest.testmod()