Как запустить класс из файла jav jar на Hadoop?

У меня есть файл jar, экспортированный из Eclipse (Runnable JAR>> Скопируйте необходимые библиотеки в подпапку).

В Java, если вы установите основной класс в manifest.xml, вы можете запустить:

java -jar MyTest.jar arguments

если вы хотите запустить другой основной класс в jar-файле или если вы не установили основной класс в manifest.xml, вы можете запустить:

java -cp MyTest.jar MyOtherMainClass arguments

В Hadoop, если основной класс установлен в manifest.xml, вы можете запустить:

hadoop jar MyTest.jar arguments

Если вы введете:

hadoop jar MyTest.jar MyOtherMainClass arguments

Он будет рассматривать MyOtherMainClass в качестве аргумента (а не класса для запуска) в массиве "args" исходного основного класса jar.

Теперь, если вы хотите запустить другой основной класс в файле jar, что вы будете печатать?

Я ожидаю что-то похожее на:

hadoop java -cp MyTest.jar MyOtherMainClass arguments

но это дает:

Error: Could not find or load main class java

Обратите внимание: если я уберу "hadoop" из "hadoop java -cp MyTest.jar MyOtherMainClass arguments", он запустится нормально

1 ответ

Проблема возникает из-за того, что Eclipse заставляет вас устанавливать основной класс в jar-файле и, следовательно, не позволяет запустить нужный вам класс. Все, что вам нужно сделать, это удалить основной класс из файла manifest.xml файла jar и запустить:

hadoop jar MyTest.jar MyOtherMainClass arguments

Посмотрите здесь: http://www.roman10.net/2012/07/26/specify-the-main-class-in-a-jar-file-for-hadoop/

Я набрал тот же текст в случае удаления URL:

Hadoop поддерживает выполнение файла JAR. Для исполняемого файла JAR в обычном исполнении Java можно указать основной класс в командной строке, как описано в моем предыдущем посте: переключение между основными классами в файле JAR.

Тем не менее, правила немного отличаются для исполняемого файла JAR, запущенного с Hadoop. В основном соблюдаются следующие правила (я тестировал на Hadoop 1.0.3),

Если файл jar содержит основной класс, указанный в его файле манифеста, hadoop возьмет основной класс, даже если команда задает другой основной класс. Это отличается от обычного выполнения Java, где мы можем указать основной класс для перезаписи класса в файле манифеста. Если файл jar не содержит основного класса в файле манифеста, hadoop позволяет нам указать основной класс. В eclipse, когда кто-то экспортирует проект как исполняемый jar-файл, он всегда запрашивает главный класс в конфигурации запуска.

Выбранный основной класс будет помещен в файл манифеста. Ниже приведено содержимое файла META-INF/MANIFEST.MF в моем проекте helloworld, где для основного класса установлено значение HelloWorld.

Манифест-версия: 1.0 Class-Path: . Main-Class: hello.HelloWorld Можно просмотреть файл jar с помощью средства извлечения файлов, открыть файл манифеста с помощью редактора файлов и просто удалить последнюю строку, чтобы удалить конфигурацию основного класса, и сохранить изменения в файле jar при появлении запроса., Это создаст исполняемый файл JAR без основного класса.

Затем модифицированный файл JAR можно использовать в Hadoop с предоставленной пользователем конфигурацией основного класса, как показано в примере команды ниже:

$ hadoop jar hello.jar hello.HelloWorld

Другие вопросы по тегам