2010-06-10 34 views
15

Làm cách nào để thêm trình điều khiển JDBC khi chạy vào Jython? Sử dụng CLASSPATH hoạt động, nhưng sử dụng sys.path không làm việc với zxJDBC mặc dù lớp được nhập tốt và có thể được thao tác từ dấu nhắc trình thông dịch Jython.Trình điều khiển Jython CLASSPATH, sys.path và JDBC

Tại sao công việc này:

$ 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'> 

Nhưng điều này không?

$ ./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 

Ứng dụng này có liên quan gì đến trình nạp lớp không?

Trả lời

5

Giải pháp là phức tạp, nhưng mọi thứ được giải thích here.

+1

Có vẻ như lý do là vì Trình điều khiển JDBC chỉ sử dụng các trình điều khiển được nạp bằng trình nạp lớp hệ thống, mặc dù những gì được đăng ký là một cá thể trình điều khiển, không phải là một lớp. Cảm ơn bạn đã liên kết. Đối với bất kỳ người nào khác đọc, http://stackoverflow.com/questions/288828/how-to-use-a-jdbc-driver-from-an-arbitrary-location và http://www.kfu.com/~nsayer/ Java/dyn-jdbc.html có thể hữu ích. – lmz

+4

-1 Liên kết chết, vì vậy giải pháp hiện đã bị mất. – brice

+0

Liên kết hoạt động tốt. – hhhhhh

19

Dường như ngay cả liên kết được cập nhật cũng không hoạt động nữa (ít nhất là với jython-2.5.3b3).

Dưới đây là một phiên bản làm việc:

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: [email protected] 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() 

tôi giữ this Gist cập nhật với phiên bản sản xuất của tôi.

+0

Mã từ liên kết được cập nhật ở trên không hoạt động, nhưng điều này đã làm! (đã phải đưa ra các ý kiến) – bobfet1

+0

Mã trong cuốn sách Jython 1.0 đã không làm việc cho tôi hoặc trên Jython 2.5.2, nhưng importJar đã làm. Cảm ơn ! – David

Các vấn đề liên quan