JavaClass 的定义
public class JavaClass {
    private String str = "";
    public JavaClass() {
        this.str = "JavaClass Init";
    }
    public String getStr() {
        return str;
    }
    public void setStr(String str) {
        this.str = str;
    }
}

一、命令行模式

1、进入 jython 目录,查看当前目录下只有一个JavaClass.java文件

D:\>cd jython
D:\jython>dir
2012-03-13  09:59    <DIR>          .
2012-03-13  09:59    <DIR>          ..
2012-03-13  09:59               227 JavaClass.java
               1 个文件            227 字节
               2 个目录 37,943,169,024 可用字节
               
2、启动Jython 命令行模式(jython版本是 2.2.1)

D:\jython>jython

3、导入 JavaClass时,提示找不到JavaClass模块

>>> import JavaClass
Traceback (innermost last):
    File "<console>", line 1, in ?
ImportError: no module named JavaClass

原因:Jython中导入的是.class文件,而JavaClass.java尚未编译生成 .class文件

4、Ctrl-Z退出 Jython, 编译 JavaClass.java

D:\jython>javac JavaClass.java
D:\jython>dir
2012-03-13  10:12    <DIR>          .
2012-03-13  10:12    <DIR>          ..
2012-03-13  10:12               443 JavaClass.class
2012-03-13  09:59               227 JavaClass.java
               2 个文件            670 字节
               2 个目录 37,943,169,024 可用字节

5、按第2步,再次进入Jython模式后导入 JavaClass时未报异常,说明成功导入,简单调用情况如下

D:\jython>jython
>>> import JavaClass
>>> jc = JavaClass()
>>> jc.str    // 调用get方法
'JavaClass Init'
>>> jc.str = "JavaClass CMD"    // 调用set方法
>>> jc.str

'JavaClass CMD'

二、eclipse IDE 环境

workplace 是d:\python,项目名称是mython,其结构如下

mython
    ......
    bin
        javaDemo
            JavaClass.class
        jythonDemo
            Jy2Ja.py
    lib
        ......
        jython.jar
    src
        javaDemo
            JavaClass.java
        jythonDemo
            Jy2Ja.py

1、JavaClass.java同上(但是第一行多了一个package javaDemo的定义)

2、编辑Jy2Ja.py如下:

from javaDemo import JavaClass
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str

测试运行时报异常
Traceback (most recent call last):
  File "D:\python\Mython\src\jythonDemo\Jy2Ja.py", line 4, in <module>
    from javaDemo import JavaClass
ImportError: No module named javaDemo

原因:找不到javaDemo是因为“当前路径”下找不到JavaDemo文件或者目录

解决方法:可以在导入JavaClass之前导入sys.path,再 print sys.path 查看“当前路径”如下:
['D:\\python\\Mython\\src\\jythonDemo', 'C:\\Java\\jdk1.6.0_21\\jre\\lib\\resources.jar', 'C:\\Java\\jdk1.6.0_21\\jre\\lib\\rt.jar', ......, '__classpath__', '__pyclasspath__/']

手工添加 'D:\python\Mython\src\JavaDemo'到sys.path里,但是必须在导入JavaClass之前(Python是脚本语言,行解释的)

3、Jy2Ja.py修改后如下:

import sys.path  as path
path.append("D:\python\Mython\src\javaDemo")
from javaDemo import JavaClass
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str

测试运行时仍然报2中的异常,找不到JavaDemo

原因:手工添加的 'D:\python\Mython\src\JavaDemo'有问题。因为在eclipse IDE中,每个类都在一个包里,而包是当前路径的一部分,即JavaClass已经在包JavaDemo中

4、再次修改后如下:

import sys.path  as path
path.append("D:\python\Mython\src")
from javaDemo import JavaClass
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str

测试运行时仍然报异常
Traceback (most recent call last):
  File "D:\python\Mython\src\jythonDemo\Jy2Ja.py", line 4, in <module>
    from javaDemo import JavaClass
ImportError: cannot import name JavaClass
但是与2中的异常不一样:不能导入JavaClass。

原因:不能导入说明找到了,但是导入的时候出了问题。

在命令行中第3步中提到Jython文件导入的应该是.class文件,在看前面mython项目的整个目录发现,class文件在mython\bin\javaDemo中。也就是说可能是因为编译器找到了JavaClass的定义即 JavaClass.java,但是找不到它的.class文件。

那java文件对应的class文件为什么不是在src包下的JavaDemo中,而是在bin包下的JavaDemo中?

右击项目mython->Properties->Java Build Path->source最下面有default output folder中默认的是mython\bin,且这个目录在 Package Explorer视图下是看不到的,在Navigator视图中可以看到。

5、将default output folder 修改为 mython\src,目录结构变化如下

mython
    ......
    lib
        ......
        jython.jar
    src
        javaDemo
            JavaClass.class
            JavaClass.java
        jythonDemo
            Jy2Ja.py

测试运行成功:
JavaClass Init
JavaClass IDE

总结:对于新手不太习惯命令行式的Java程序调试,IDE虽然简单方便,但是都有自己默认的规则。这些规则新手可能注意不到,所以在IDE环境中照搬程序源码的时候,总会报一些奇奇怪怪的错误,使得本来简单的问题看上去很复杂。究其原因:1、对开发环境不熟悉、2、java基础不扎实。

特殊情况备注:

1、***.py文件运行时,默认路径即该文件的所在路径,导入***.class时的路径就变成了 ***.py所在的包 + from中的包,即默认.class文件是在 ***.py所在的包 的 子包中,所以在调用Java文件时,需要特别添加class文件所在路径。即使Java文件和Jython文件在同一个包中,Java文件仍然在某个包中,测试运行时仍然要设置java文件所在的包最上级所在的目录,一般为 src。

2、将Java文件和Jython文件都放在 src 下时,虽然目录结构中显示一个叫"(default package)",但是在Java文件的内部是没有包的设定的,这种情况下运行Jython文件时,可不手工设置class文件所在路径,因为此时 Jython文件的所在目录为src,而Java文件也在src中,且没有包名引起的问题。

3、其实只要Jython文件在 src 下,Java文件在哪里都可以

刚刚接触 Python,正在学习java开发,故从 Jython 入手。因为基础不太扎实,期间诸多碰壁,仅此记录。

成长的道路上不怕跌倒,怕的是的跌倒了再也爬不起来。为自己加油!

原文链接:http://blog.csdn.net/newxren/article/details/7350255?reload

Jython 调用 Java 碰壁全纪录相关推荐

  1. Python+Jpype 调用 Java 碰壁全记录

    因为在Jython 调用 Java 碰壁全纪录中已经有了"出色"碰壁经历,此处仿照其大致过程 命令行下无差异,Eclipse中略有差异(classpath的设置方式不同所致) Ja ...

  2. jython 调用java_Jython简介,第1部分:Java编程变得更容易

    关于本教程 本教程是关于什么的? 这个分为两部分的教程将向您介绍Jython脚本语言,并为您提供足够的知识以开始开发自己的基于Jython的应用程序. Jython是已与Java平台无缝集成的Pyth ...

  3. jython 引入java.lang_Jython与Java的互相调用

    Jython与Java的互相调用 上一篇 / 下一篇  2008-03-09 23:00:10 一.在Java中调用Jython 主要是调用这个类org.python.util.PythonInter ...

  4. vue java 插件开发_实习模块vue+java小型全栈开发(三)

    实习模块vue+java小型全栈开发(三) --dx 背景 首先,先给自己一个答案:这篇博客我定义为(三),因为之前的两个模块页面,内容都是一样的,但是被改了几次需求,就一直拖着没有上传. 今天是真正 ...

  5. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  6. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  7. C# 调用Java接口

    最近工作任务中包含了系统之间数据的互通,当然就考虑系统互相开通接口来实现通信了! 作为.NET的开发者,还没有调用过Java接口的经历,惭愧惭愧! 话不多说,直接进入正题! 调用webservice接 ...

  8. .net core ocelot 获取路由的mothed_Net Core微服务入门全纪录(四)Ocelot网关(上)

    上一篇[.Net Core微服务入门全纪录(三)--Consul-服务注册与发现(下)]已经使用Consul完成了服务的注册与发现,实际中光有服务注册与发现往往是不够的,我们需要一个统一的入口来连接客 ...

  9. python2.7能调用java_Python可以调用Java框架吗?

    Jython Jython是从python调用Java的一种方法实际上,您可以在javajvm内部运行python.这使您能够访问在JVM上运行的几乎所有Java,但是有许多限制.在 因为Jython ...

最新文章

  1. 借力5G,云VR将推动VR产业迎“第二春”
  2. 微信小程序问题解决方案
  3. 【Qt】Qt中QJsonDocument 类
  4. 小程序 --- Tab组件的封装
  5. 华为服务器故障灯不开机_华为服务器日常维护及故障处理介绍V.ppt
  6. Java EE 7中包含哪些JSR?
  7. oracle中 使用不了,Oracle 中不使用NOT IN 和 NOT EXISTS的另一种方法
  8. C语言 链式栈和顺序栈的实现
  9. k6前级效果器怎么用_P18:调制类效果器的那些事儿(Modulation)
  10. zabbix监控mysql内存_zabbix通过自定义脚本监控nginx,php-fpm和mysql占用内存数和进程的个数...
  11. 顶级的CSS和Javascript动画框架
  12. 史上最详细的Studio教程二来啦
  13. 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——2.2节理解主机到主机的通信模型...
  14. 勒索病毒在线解密网站汇总
  15. js生成二维码的几种方法
  16. html5 街景,html5+webgl 三维街景的渲染
  17. iOS App 签名的原理 App 重签名(一)
  18. 一种提升多分类准确性的Trick
  19. 百度移动营销页常见问题汇总,99%的人不知道
  20. Selenium基础 — 多窗口操作

热门文章

  1. pytorch TorchScript 简介
  2. 数组去重c语言,C语言数组去重
  3. GOJS入门三-如何设置节点间的连线
  4. 运行时数据区-堆(Heap)
  5. 计算机对商务英语的不利之处,商务英语教学中计算机网络利弊分析论文.docx
  6. 帝国cms:评论列表模板中调用热门文章或是推荐文章的js方法
  7. java 属性签名_java – 使用BouncyCastle将签名/身份验证的属性添加到CMS签名
  8. Linux 下 启动 Oracle
  9. 西安知名IT互联网公司—为自己回西安做铺垫
  10. doubb超时_dubbo超时原理以及解决方案