Как запустить класс из файла 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