Не удается запустить проект Java, настроенный на использование Jython из JAR

У меня есть проект Java, в котором используется библиотека Jython. Я могу создать код и выполнить его нормально либо в Eclipse, либо из командной строки, однако, когда я упаковываю проект в файл JAR, я получаю следующую ошибку:

ImportError: no Module named socket

Я знаю, что означает эта ошибка, и сокет — это первый модуль в рассматриваемом скрипте Python. Почему это не запускается из файла JAR? Jython.jar также упакован внутри JAR, который я создал, поэтому я думаю, что он сможет его найти. Любые идеи?


person Bender the Greatest    schedule 07.07.2011    source источник


Ответы (2)


При запуске из Eclipse (который управляет путем к классам для вас) или из командной строки (где, как я предполагаю, вы указываете путь к классам при его запуске), вы включаете Jython.jar в путь к классам.

К сожалению, включения других банок внутрь вашей банки недостаточно, чтобы поместить эту банку в путь к классам. Вы можете извлечь весь Jython.jar и включить извлеченные файлы в свой jar (более поздние версии Eclipse делают это при экспорте с параметром Runnable JAR File).

Однако это может привести к проблемам, если код Jython ожидает, что он будет в JAR, если есть конфликты пространств имен или юридические проблемы (во многих случаях незаконно извлекать сторонний jar и распространять его как свой собственный).

Чтобы убедиться в этом, попробуйте запустить банку вне Eclipse, включив jython.jar в путь к классам. Например:

java -cp lib/jython.jar:myjar.jar com.me.main.Main

Имейте в виду, что если вы используете параметр -jar (например, атрибут основного класса), то флаг -cp игнорируется, поэтому это не сработает, если вы сделаете:

java -cp lib/jython.jar -jar myjar.jar

Если это проблема, то есть несколько способов автоматически включить jython.jar в путь к классам. Два популярных подхода — использовать атрибут classpath в манифесте (работает до тех пор, пока вы можете гарантировать местоположение jython.jar относительно вашего основного jar-файла) или заключить выполнение вашего jar-файла в сценарий оболочки.

person Pace    schedule 07.07.2011
comment
Есть ли способ отредактировать путь к классам в манифесте, чтобы он ссылался на JAR, упакованный в основной JAR? - person Bender the Greatest; 08.07.2011
comment
Я узнал о проблеме, но на данный момент у меня нет большого решения. Я заглянул внутрь JAR, и оказалось, что модуль Python не встраивается в JAR. Если я положу его в корень JAR с помощью диспетчера архивов, JAR каждый раз запускается, как и предполагалось. Но вы были правы, @Pace, очевидно, модуля Python не было в пути к классам, как и в JAR. - person Bender the Greatest; 11.07.2011

У меня были похожие проблемы, пока я не обнаружил, что на самом деле есть два Jython jar - jython.jar и jython-standalone.jar. Автономный jar-файл включает в себя все стандартные модули Python Lib. Использование этого, казалось, исправило мои проблемы, связанные с импортом.

person eff    schedule 13.09.2011