如何让Jython自动加载一个Jar包
Jython 的docstring 严重缺失, pydev的calltip基本上没什么用, 所以使用 jython 开发比较痛苦.
但 jython 相比 cpython 仍有2个优势:
1. windows/linux下安装都超级简单, 在linux下安装也不需要root账号.
2. 可以使用丰富的java类库, 比如, teradata只提供jdbc driver, 没有python API module
=========================
如何让jython自动加载一个新的jar
=========================
用 jython 又写个小程序, 需要使用 teradata 的 jdbc 库(terajdbc4.jar和tdgssconfig.jar). 开发时将两个jar库加到Eclipse(pydev)的 external library中, 开发调试都很顺利.
但部署时, 就要考虑如何让jython加载我们的jar包了. 最简单的方法是, 将terajdbc4.jar配到OS的CLASSPATH环境变量中.
以前我研究出的另一个方法, 是修改 jython.jar 中的 MANIFEST.MF文件, 把依赖库加到MANIFEST.MF的Class-Path中, 具体配置如下,
Class-Path:
lib/tdgssconfig.jar
lib/terajdbc4.jar
这涉及到解压/更新文件/压缩, 确实很麻烦. 随便改动jython.jar也不是一个好的做法. 另外, 这种方法只能解决jar 依赖, 如果是依赖一个java class, 这种方法就不好用了.
这次决心找找有没有其他办法, 研究了Jython的源码, 终于找到一个方便的方法. 即修改jython的registry 文件. 下面是详细说明.
在查看jython的源码后 (C:\jython2.5.2\src\org\python\core\packagecache\SysPackageManager.java)
有如下收获: jython会根据安装根目录下 registry 文件的配置, 预先加载一些java 的jar 和 class, 下面是registry文件相关的3个设置,
(1)python.packages.paths, 默认取值为java.class.path, sun.boot.class.path, 实际的目录为可通过java代码. 而这两目录值是可以jython.bat中的JAVA_HOME推导出来的.
注意该设置的取值仍然register的entry, 如果我们要新加目录, 增加一个property entry.
jython 会加载目标目录中的所有class.
(2)python.packages.fakepath, 没有默认值, 取值是一个实际的目录地址.
jython 会加载目标目录中的所有class.
(3)python.packages.directories, 默认值为java.ext.dirs, 实际的目录目录值是可以jython.bat中的JAVA_HOME推导出来的, 一般为 Your_JavaHome/lib/ext
注意该设置的取值仍然register的entry.
jython 会加载目标目录中的所有 jar.
默认的 registry 文件的设置
# Properties to check for initializing and updating the package cache
# Hopefully you won't have any need to change these
python.packages.paths = java.class.path, sun.boot.class.path
python.packages.directories = java.ext.dirs
修改后的设置, 增加了一个 apache.class.path, python.packages.fakepath 和 teradata.jdbc.dirs
python.packages.paths = java.class.path, sun.boot.class.path, apache.class.path
python.packages.directories = java.ext.dirs, teradata.jdbc.dirs
python.packages.fakepath = c:\\jboss_java_util\\classes
apache.class.path = c:\\apache_java_util\\classes
teradata.jdbc.dirs = c:\\teradata\\jdbc
=========================
如果碰到其他疑难杂症, 怎么办?
=========================
一旦碰到问题, 关键是要知道问题的原因, 修改 registry 文件的属性 python.verbose 为debug, 会输出更多的信息, 有助于我们找到问题的根源.
默认设置:
python.verbose = message
修改后的设置:
python.verbose = debug