Jython не хочет импортировать пользовательский класс; ImportError: No module named ******

Я бьюсь головой о стену уже пару дней, пытаясь разобраться в этом. Я начал играть с Jython для быстрого создания прототипов. Я столкнулся с, казалось бы, невероятно простой проблемой, но я просто не могу ее решить.

Я был в главе 10 JythonBook и столкнулся с проблемой, когда попытался написать и использовать класс "Beach" (начиная с раздела "Листинг 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 "", line 1, in 
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 "", line 1, in 
ImportError: No module named Beach
>>> from Beach import Beach
Traceback (most recent call last):
  File "", line 1, in 
ImportError: No module named Beach
>>> 

Должен ли я также опубликовать мой ~/.bash_profile?

Я довольно много порылся в интернете и StackOverflow. Этот пост дал мне идею попробовать "целевой импорт", но, как вы можете видеть, это не сработало. Я просто не могу заставить это работать. Прочитав немного об опасностях, связанных с CLASSPATH, я оставил это в покое.

Я должен отметить, что я не новичок в программировании - я был студентом CS и кодировал (в основном научные вычисления) в течение последних 6 или около того лет. Я довольно новичок в Java; я только начал программировать на Java в начале этого года. Это кажется довольно простым, и NetBeans позаботился обо всем, чего я не знаю.

Я боюсь, что я неправильно понимаю что-то о пути классов для Java. Я также переместил некоторые банки в те места, которые, по моему мнению, должна "искать" Java - /System/Library/Java/Extensions/, /Library/Java/Extensions/, и /usr/lib/java/ (я знаю...), но ничего, кажется, не изменило вышеупомянутых ошибок.

(Возможно, это связано с тем, что после того, как я поиграл с этим, Netbeans, похоже, не может создать новый проект - сейчас я делаю это вручную. Не уверен, что это полезная информация.)

Любые мысли? Я невероятно благодарен за любую помощь!

EDIT: Попробовав комментарий ниже, я получил следующее:

$ 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 "", line 1, in 
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;
    }
}
>>>

Я знаю, что пакеты Java основаны на файловой структуре. Если здесь что-то совершенно очевидно неправильно, пожалуйста, дайте мне знать. Тем временем, пришло время почитать о том, как работают пакеты Java (вместо того, чтобы позволять Netbeans всегда управлять ими).

9
задан Community 23 May 2017 в 01:45
поделиться