Jython 无法加载 org.sqlite.JDBC / Classpath Issue



我在使用Jython和SQLite jar文件时遇到了一些问题。由于某种原因,我的应用程序无法加载 Sqlite JDBC 类并抛出java.lang.ClassNotFoundException: java.lang.ClassNotFoundException: org.sqlite.JDBC错误。

我从 http://code.google.com/p/sqlitebot/downloads/detail?name=sqlitejdbc-v056.jar 下载了jdbc jar文件。

我的项目结构

/我的项目

/

myproject/Lib/sqlitejdbc.jar

/

myproject/jython.jar (单机版)

/

myproject/application.py

我正在使用的命令:

$ java -jar jython.jar -Dpython.path=Lib/sqlitejdbc.jar Application.py

我为 sys.path 属性获得的输出

['/Users/[User]/[ProjectLocation]/[ProjectName]', '/Users/[User]/[ProjectLocation]/[ProjectName]/Lib/sqlitejdbc.jar', '/Users/[User]/[ProjectLocation]/[ProjectName]/Lib', '/Users/[User]/[ProjectLocation]/[ProjectName]/jython.jar/Lib', '__classpath__', '__pyclasspath__/']

Application.py 来源:

################################################################################
#
#  sqlite_using_jdbc - An example of using straight JDBC mechanisms to
#                      interact with a SQLite database.
#                      Creates a 'planet' table in a SQLite database
#                      named 'solarsys.db', populates it with some data and
#                      then executes a query to retrieve data from that table.
#
#  Works with Jython 2.5, must have the zentus sqlitejdbc.jar in your
#  CLASSPATH at execution time.
#  Known to work with sqlitejdbc-v056.jar
#
################################################################################
import sys
print sys.path
# sys.exit(0)
from java.lang import Class
from java.sql  import DriverManager, SQLException
################################################################################
DATABASE    = "solarsys.db"
JDBC_URL    = "jdbc:sqlite:%s"  % DATABASE
JDBC_DRIVER = "org.sqlite.JDBC"
TABLE_NAME      = "planet"
TABLE_DROPPER   = "drop table if exists %s;"                      % TABLE_NAME
TABLE_CREATOR   = "create table %s (name, size, solar_distance);" % TABLE_NAME
RECORD_INSERTER = "insert into %s values (?, ?, ?);"              % TABLE_NAME
PLANET_QUERY = """
select name, size, solar_distance
from %s
order by size, solar_distance desc
""" % TABLE_NAME
PLANET_DATA = [('mercury' , 'small' ,    57),  # distance in million kilometers
               ('venus'   , 'small' ,   107),
               ('earth'   , 'small' ,   150),
               ('mars'    , 'small' ,   229),
               ('jupiter' , 'large' ,   777),
               ('saturn'  , 'large' ,   888),
               ('uranus'  , 'medium',  2871),
               ('neptune' , 'medium',  4496),
               ('pluto'   , 'tiny'  ,  5869),
               ]
################################################################################
def main():
    dbConn = getConnection(JDBC_URL, JDBC_DRIVER)
    stmt = dbConn.createStatement()
    try:
        stmt.executeUpdate(TABLE_DROPPER)
        stmt.executeUpdate(TABLE_CREATOR)
    except SQLException, msg:
        print msg
        sys.exit(1)
    if populateTable(dbConn, PLANET_DATA):
        resultSet = stmt.executeQuery(PLANET_QUERY)
        while resultSet.next():
            name = resultSet.getString("name")
            size = resultSet.getString("size")
            dist = resultSet.getInt   ("solar_distance")
            print "%-16.16s  %-8.8s  %4d" % (name, size, dist)
    stmt.close()
    dbConn.close()
    sys.exit(0)
################################################################################
def getConnection(jdbc_url, driverName):
    """
        Given the name of a JDBC driver class and the url to be used
        to connect to a database, attempt to obtain a connection to
        the database.
    """
    try:
        Class.forName(driverName).newInstance()
    except Exception, msg:
        print msg
        sys.exit(-1)
    try:
        dbConn = DriverManager.getConnection(jdbc_url)
    except SQLException, msg:
        print msg
        sys.exit(-1)
    return dbConn
################################################################################
def populateTable(dbConn, feedstock):
    """
        Given an open connection to a SQLite database and a list of tuples
        with the data to be inserted, insert the data into the target table.
    """
    try:
        preppedStmt = dbConn.prepareStatement(RECORD_INSERTER)
        for name, size, distance in feedstock:
            preppedStmt.setString(1, name)
            preppedStmt.setString(2, size)
            preppedStmt.setInt   (3, distance)
            preppedStmt.addBatch()
        dbConn.setAutoCommit(False)
        preppedStmt.executeBatch()
        dbConn.setAutoCommit(True)
    except SQLException, msg:
        print msg
        return False
    return True
################################################################################
################################################################################
if __name__ == '__main__':
    main()

sqlitejdbc.jar中的类也需要在java类路径上可用,这在使用独立的jython时实际上很棘手.jar通过java -jar。 从 Java 文档...

-.jar

使用此选项时,JAR 文件是所有用户类的源,其他用户类路径设置将被忽略。

因此,使用 -jar 时无法向类路径添加任何内容。 但是,请参阅此答案以获取解决方案 - 基本上将jython.jar也添加到类路径中(使用-cp或CLASSPATH)并直接运行org.python.util.jython类。

相关内容

  • 没有找到相关文章

最新更新