【问题标题】:Jython CLASSPATH, sys.path and JDBC driversJython CLASSPATH、sys.path 和 JDBC 驱动程序
【发布时间】:2011-03-02 04:46:49
【问题描述】:

如何在运行时将 JDBC 驱动程序添加到 Jython?使用 CLASSPATH 有效,但使用 sys.path 不适用于 zxJDBC,即使该类已正常导入并且可以从 Jython 解释器提示符进行操作。

为什么会这样:

$ CLASSPATH=/tmp/jtds\-1.2.5.jar ./jython
*sys-package-mgr*: processing new jar, '/private/tmp/jtds-1.2.5.jar'
Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54) 
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_20
Type "help", "copyright", "credits" or "license" for more information.
>>> from java.lang import Class
>>> Class.forName('net.sourceforge.jtds.jdbc.Driver')
<type 'net.sourceforge.jtds.jdbc.Driver'>

但这不是吗?

$ ./jython

Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54) 
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_20
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.extend(['/tmp/jtds-1.2.5.jar'])
>>> from java.lang import Class
>>> Class.forName('net.sourceforge.jtds.jdbc.Driver')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)

java.lang.ClassNotFoundException: java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver
>>> sys.path
['', '/home/me/pkg/jython2.5.1/Lib/site-packages/distribute-0.6.13-py2.5.egg', '/home/me/pkg/jython2.5.1/Lib', '__classpath__', '__pyclasspath__/', '/home/me/pkg/jython2.5.1/Lib/site-packages', '/home/me/pkg/jython2.5.1/Lib/site-packages/setuptools-0.6c11-py2.5.egg-info', '/tmp/jtds-1.2.5.jar']
>>> import net.sourceforge.jtds.jdbc.Driver as Driver
>>> drv = Driver()
>>> drv
jTDS 1.2.5

它与类加载器有关吗?

【问题讨论】:

    标签: jdbc jython classloader


    【解决方案1】:

    看起来即使更新的链接也不再起作用(至少对于 jython-2.5.3b3)。

    这是一个工作版本:

    def importJar(jarFile):
        '''
        import a jar at runtime (needed for JDBC [Class.forName])
    
        adapted from http://forum.java.sun.com/thread.jspa?threadID=300557
        Author: SG Langer Jan 2007 translated the above Java to Jython
        Author: seansummers@gmail.com simplified and updated for jython-2.5.3b3
    
        >>> importJar('jars/jtds-1.2.5.jar')
        >>> import java.lang.Class
        >>> java.lang.Class.forName('net.sourceforge.jtds.jdbc.Driver')
        <type 'net.sourceforge.jtds.jdbc.Driver'>
        '''
        from java.net import URL, URLClassLoader
        from java.lang import ClassLoader
        from java.io import File
        m = URLClassLoader.getDeclaredMethod("addURL", [URL])
        m.accessible = 1
        m.invoke(ClassLoader.getSystemClassLoader(), [File(jarFile).toURL()])
    
    if __name__ == '__main__':
        import doctest
        doctest.testmod()
    

    我会使用我的生产版本更新this Gist

    【讨论】:

    • 上面更新链接中的代码不起作用,但确实如此! (不得不取出 cmets)
    • Jython 1.0 书中的代码在 Jython 2.5.2 上也不适用于我,但 importJar 可以。谢谢!
    【解决方案2】:

    解决方案很棘手,但一切都解释了here

    【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多