关于jython脚本的java类库依赖


jython是python语言的java实现,理论上是支持无缝调用java类库,但在实际使用中经常会碰到类库设置问题,以下是我学习到的一些解决方法。

jython解释器启动时

$ jython -J-cp=foo.jar:bar.jar

-J-cp的值会传递给jvm,具体可以参照jython –help。

简单jython脚本

import sys

if __name__ == '__main__':
  sys.os.path.append('foo.jar')
  sys.os.path.append('bar.jar')
  // do stuff

追加到sys.os.path中。个人不是很清楚这种方法的具体原理是什么,但是对简单的脚本还是可行的。

设置CLASSPATH

如果是做类似JDBC的脚本时,sys.os.path貌似是无效的,一直会报找不到指定的driver。这时就需要设置CLASSPATH了。

#!/usr/bin/env sh

ORIGIN_CLASSPATH=`echo $CLASSPATH`
LIB_DIR=.
LIB_JARS=`ls $LIB_DIR/*.jar | tr '\n' ':'`

export CLASSPATH=$LIB_JARS:$ORIGIN_CLASSPATH

jython foo.py $@

相信有Java背景的人很熟悉这个环境变量。这里假设jython脚本名字为foo.py。上面的内容表示列举当前目录下的jar文件并设置CLASSPATH,jvm读取CLASSPATH后决定到哪里找类。

小结

某种意义上来说,个人认为各种方法的目的都是让jvm能够接受到类库地址设定。
其次,对于需要维护下去的脚本来说,建议使用第三种方式。