2010-06-10 15 views
15

मैं जेडथन में रनटाइम पर जेडीबीसी ड्राइवर कैसे जोड़ सकता हूं? क्लासस्पैट का उपयोग करना, लेकिन sys.path का उपयोग zxJDBC के साथ काम नहीं करता है, भले ही कक्षा ठीक से आयात की जाती है और इसे ज्योथन दुभाषिया संकेत से छेड़छाड़ की जा सकती है।ज्योथन क्लास्स्पैट, sys.path और जेडीबीसी ड्राइवर

क्यों यह काम करता है:

$ 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 

क्या इसमें क्लासलोडर के साथ कुछ करना है?

उत्तर

5

समाधान मुश्किल है, लेकिन सबकुछ समझाया गया है here

+1

ऐसा लगता है कि कारण यह है कि जेडीबीसी ड्राइवर प्रबंधक केवल सिस्टम क्लासलोडर का उपयोग करके लोड किए गए ड्राइवरों का उपयोग करता है, भले ही पंजीकृत है, एक ड्राइवर उदाहरण है, कक्षा नहीं। आपके लिंक के लिए धन्यवाद। किसी भी अन्य पढ़ने के लिए, http://stackoverflow.com/questions/288828/how-to-use-a-jdbc-driver-from-an-arbitrary-location और http://www.kfu.com/~nsayer/ जावा/dyn-jdbc.html सहायक हो सकता है। – lmz

+4

-1 मृत लिंक, तो समाधान अब खो गया है। – brice

+0

लिंक ठीक काम करता है। – hhhhhh

19

ऐसा लगता है कि अद्यतन लिंक अब और काम नहीं करता है (कम से कम 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: [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() 

मैं रखने this Gist मेरी उत्पादन संस्करण के साथ अद्यतन:

यहाँ एक काम कर संस्करण है।

+0

उपरोक्त अद्यतन लिंक से कोड काम नहीं करता है, लेकिन यह हुआ! (टिप्पणियां लेनी थीं) – bobfet1

+0

ज्योथन 1.0 पुस्तक में कोड मेरे लिए या तो ज्योथन 2.5.2 पर काम नहीं करता था, लेकिन आयात जार ने किया था। धन्यवाद ! – David

संबंधित मुद्दे