现在我已经把头撞到了墙上几天,试图解决这个问题.我一直在开始使用Jython进行快速原型设计.我已经看到了一个看起来非常基本的问题,但我似乎无法超越它.
我是在JythonBook的10章,并击中了问题,当我试着写,并使用了"滩"级(在标有"清单10-1"一节开始).我可以导入并使用java.lang.Math就好了,但无法让"Beach"类为我的生活工作.我写了Beach类,把它变成了一个jar并改变了权限,
jar cf Beach.jar Beach.java chmod 777 Beach.jar
并确保Beach.jar和Beach.java都在当前的工作目录中,以及/ Library/Java/Extensions /(我在Mac上) - 没有骰子.
我只是想不出可能是什么问题.我希望有人会在这里看到我错过的东西.
为了您的方便,我认为从"实时"Jython会话中可能有用的一切:
$ jython
Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06)
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_24
Type "help", "copyright", "credits" or "license" for more information.
>>> ## First try importing "Math" from Java:
>>> from java.lang import Math
>>> Math.max(4, 7)
7L
>>> ## Try System from Java:
>>> javasystem.out.println("Hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'javasystem' is not defined
>>> from java.lang import System as javasystem
>>> javasystem.out.println("Hello")
Hello
>>> ##
>>> ## Now try to import my own class, written as in the JythonBook
>>> ## This is where the trouble starts:
>>> ## First check that I am in the correct place, look at the system path:
>>> import os
>>> os.system("pwd")
/Users/me/EclipseProjects/JythonTutorial/JavaClasses
0
>>> os.system("ls -la")
total 16
drwxr-xr-x 4 me staff 136 Oct 19 11:25 .
drwxr-xr-x 7 me staff 238 Oct 19 02:16 ..
-rwxrwxrwx 1 me staff 567 Oct 19 11:25 Beach.jar
-rwxrwxrwx 1 me staff 256 Oct 19 11:14 Beach.java
0
>>> ## Let's look at the guts of Beach.java quickly:
>>> os.system("cat Beach.java")
public class Beach {
private String name;
public Beach(String name, String city){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
0
>>> ## Let's also look at the system path:
>>> import sys
>>> sys.path
['', '/Users/me/jython2.5.2/Lib', '__classpath__', '__pyclasspath__/', '/Users/me/jython2.5.2/Lib/site-packages']
>>> ## I presume that the '' should indicate that I can use this.
>>> ## To be careful, I also cp Beach.jar to /Library/Java/Extensions/
>>> os.system("ls -la /Library/Java/Extensions/Beach.jar")
-rwxr-xr-x 1 me admin 567 Oct 19 11:27 /Library/Java/Extensions/Beach.jar
0
>>> ##
>>> ## Now actually attempt to load Beach:
>>> import Beach
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named Beach
>>> from Beach import Beach
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named Beach
>>>
Run Code Online (Sandbox Code Playgroud)
我还应该发布我的〜/ .bash_profile吗?
我在互联网和StackOverflow上玩了很多.这篇文章给了我尝试"目标导入"的想法,但正如你所看到的那样,这不起作用.我似乎无法让这个工作.在读了一些关于搞乱CLASSPATH的恐怖之后,我就把它留下了.
我或许应该注意到,我不是编程的新手 - 我是CS本科生并且在过去6年左右编码(主要是科学计算).我是Java的新手; 我刚刚在今年早些时候开始用Java编程.看起来非常简单,NetBeans已经处理了我不知道的一切.
我担心的是我误解了Java的类路径.我还把一些罐子移到了我认为应该被Java搜索的位置 - /System/Library/Java/Extensions /,/ Library/Java/Extensions /和/ usr/lib/java/(我知道......),但似乎没有任何改变上述错误.
(在一个可能相关的说明中,在玩这个之后,Netbeans似乎无法填充新项目 - 我现在正在手动执行此操作.不确定这是否是有用的信息.)
有什么想法吗?我非常感谢任何帮助!
编辑:在尝试下面的评论后,我得到以下内容:
$ jython
Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06)
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_24
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append("/Users/me/EclipseProjects/JythonTutorial/JavaClasses/Beach.jar")
>>> from com.stackoverflow.beach import Beach
*sys-package-mgr*: processing modified jar, '/Users/me/EclipseProjects/JythonTutorial/JavaClasses/Beach.jar'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named stackoverflow
>>> ## Look in Beach.java
>>> import os
>>> os.system("cat Beach.java")
// Beach.java
package com.stackoverflow.beach;
public class Beach {
private String name;
public Beach(String name, String city){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
>>>
Run Code Online (Sandbox Code Playgroud)
我知道Java包基于文件结构.如果这里有一些完全明显的错误,请告诉我.与此同时,还有时间了解Java包的工作原理(而不是让Netbeans始终管理它).
jython无法导入*.java文件,需要将其编译为*.class.
Makefile文件:
.PHONY: test_beach
test_beach: test_beach.py beach.jar
jython -J-classpath beach.jar $<
beach.jar: Beach.class
jar -cf $@ $<
%.class: %.java
javac $<
Run Code Online (Sandbox Code Playgroud)
$ make -k
javac Beach.java
jar -cf beach.jar Beach.class
jython test_beach.py
*sys-package-mgr*: processing modified jar, '/path/to/beach.jar'
Cocoa Beach
Run Code Online (Sandbox Code Playgroud)
test_beach.py:
#!/usr/bin/env jython
import Beach
beach = Beach("Cocoa Beach","Cocoa Beach")
print beach.getName()
Run Code Online (Sandbox Code Playgroud)
Beach.java:
//NOTE: if you declare `package a.b;` here then you should put it in a/b directory
public class Beach {
private String name;
private String city;
public Beach(String name, String city){
this.name = name;
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5918 次 |
| 最近记录: |