zoukankan      html  css  js  c++  java
  • 如何让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


  • 相关阅读:
    Oracle创建database link(dblink)和同义词(synonym)
    spring boot 集成 quartz 定时任务
    tomcat 启动Spring boot 项目
    UUID+随机数
    js常用字符串处理方法
    Win10安装mysql-8.0.11-winx64详细步骤
    ORA-02049: 超时: 分布式事务处理等待锁
    spring boot 发邮件
    bootstrap table 列求和
    spring boot 延长 Session 时间
  • 原文地址:https://www.cnblogs.com/harrychinese/p/Let_Jython_auto_load_some_jar.html
Copyright © 2011-2022 走看看