Запуск программы Java из Python

Я посмотрел здесь, здесь, здесь и здесь.

Хотя они были информативными, мне просто не хватило, чтобы обнаружить корень моей проблемы. Мой код не содержится в файле JAR, и заказчик попросил, чтобы мы не отправляли его как таковой.

Я создал приложение в Eclipse, и оттуда оно работает нормально. Я создал сценарий, который изменит метод main одного из java-файлов в целях тестирования. Я хочу запустить приложение с помощью вызова из Python после его изменения. Однако из командной строки, когда я пытаюсь вызвать программу с помощью java или java -cp ., я получаю следующую ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: DemoAPIFunctionality
Caused by: java.lang.ClassNotFoundException: DemoAPIFunctionality
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: DemoAPIFunctionality.  Program will exit.

Мой проект зависит от нескольких JAR, которые не находятся в корневом каталоге, и от файла DLL, опять же не в корневом каталоге. Я надеюсь, что это связано с местонахождением одного из них, но я не уверен и продвигаюсь мало. Вот DemoAPIFunctionality.java:

public class DemoAPIFunctionality
{
  public final static void main(String[] args)
  {
    DemoAPIFunctionality demo = new DemoAPIFunctionality();

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

Заранее спасибо.


person wheaties    schedule 22.01.2010    source источник
comment
DemoAPIFunctionality в пакете? (Если вы можете показать полный исходный код, это поможет.) Какова ваша структура каталогов и файлов? Где находятся файлы .class?   -  person Dave Jarvis    schedule 23.01.2010


Ответы (3)


Вы не упомянули, что ваш скрипт python фактически компилирует исходный файл java после применения изменений.

Eclipse скомпилирует его автоматически (встроенный конструктор), но, конечно, вне среды IDE вы должны вызвать javac, прежде чем вы сможете выполнить класс. java не будет работать с исходными файлами.

ИЗМЕНИТЬ

Я не знаю, что у вас есть практический опыт работы с java, но именно так это обычно работает в командной строке.

Предположим, у вас есть java-класс com.example.Hello с основным методом и файловой структурой вроде

/dev/bin/com/example/Hello.class

затем вы от cd до /dev/bin и делаете java com.example.Hello. Обратите внимание, что имя пакета (com.example) всегда сопоставляется со структурой папок (com/example). Если вы выполните указанную выше команду и java не сможет найти Hello.class в папке ./com/example, то она выдаст NoClassDefFoundError.

person Andreas Dolk    schedule 22.01.2010
comment
Вы так правы. Однако ошибка остается. Я использую код, скомпилированный Eclipse в данный момент из командной строки, и получаю то же самое. - person wheaties; 23.01.2010
comment
Странный. Пожалуйста, дважды проверьте, что вы действительно находитесь в папке bin вашего проекта при выполнении команды java DemoAPIFunctionality, а не в проекте или папке src (при условии, что у вас есть типичная структура папок проекта eclipse с project/src для источников и project/bin для файлов классов) - person Andreas Dolk; 23.01.2010
comment
Ага, я был в каталоге bin, а не в src. Вот почему я добавил лакомый кусочек о наличии других зависимостей JAR и зависимостей DLL, которых нет в дереве каталогов bin. - person wheaties; 23.01.2010
comment
Если он просто не может найти другие банки или DLL, он покажет другие ошибки - NoClassDefFoundErros, но для классов, расположенных в «отсутствующих» банках. - person Andreas Dolk; 23.01.2010
comment
Черт. Я буду продолжать работать над этим. Это должно быть что-то простое, но поскольку вы указали на проблему с javac до java, вы получаете кредит. Это в конечном итоге тоже сбило бы меня с толку. - person wheaties; 25.01.2010

  1. наличие классов в пакете по умолчанию (т.е. без пакета) не рекомендуется
  2. вы должны вызвать java -cp . из корневого каталога вашего проекта, то есть из каталога, в котором находится ваш .class файл, или, когда вы создаете пакеты, из каталога, в котором находится подкаталог com (org и т. д.).
  3. вы должны ссылаться на класс по его полному квалифицированному имени, то есть com.package.ClassName
  4. лучше использовать IDE - для образовательных целей есть BlueJ и JCreator. Eclipse и NetBeans более мощные и сложные.
person Bozho    schedule 22.01.2010
comment
1. Да-да, плохая я. Исправит ли это изменение? 2. Я сделал. 3. см. 1. 4. при построении в среде IDE они не хотят, чтобы демонстрация использовалась в среде IDE. Он должен показать, что его можно протестировать как есть, используя скрипт. - person wheaties; 23.01.2010

Простое решение, подсказка и ярлык. Не используйте какой-либо путь при вызове java classname изнутри python. например. commands.getstatusoutput("java -cp $CLASSPATH clusterize")

person kalegs    schedule 16.02.2011