Запуск Java-программы из Python - PullRequest
4 голосов
/ 23 января 2010

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

Хотя для информативности им просто не хватило, чтобы я смог найти корень моей проблемы. Мой код не содержится в файле 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();

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

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

Ответы [ 3 ]

4 голосов
/ 23 января 2010
  1. наличие классов в пакете по умолчанию (то есть без пакета) не рекомендуется
  2. вы должны вызывать java -cp . из корневого каталога вашего проекта - то есть из каталога, в котором находится ваш файл .class, или при создании пакетов - в каталог, где находится подкаталог com (org и т. Д.) проживает.
  3. вы должны ссылаться на класс по его полному имени - т.е. com.package.ClassName
  4. вам лучше использовать IDE - для образовательных целей есть BlueJ и JCreator. Eclipse и NetBeans более мощные и сложные.
3 голосов
/ 16 февраля 2011

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

3 голосов
/ 23 января 2010

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

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

EDIT

Я не знаю, какой у вас настоящий опыт работы с Java, но именно так он обычно работает в командной строке.

Предполагается, что у вас есть класс Java com.example.Hello с методом main и файловой структурой, такой как

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

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

...