JAVA: невозможно запустить файл jar

Я новичок в JAVA и пытаюсь понять, что не так с проектом, который я создал.

Я создал проект JAVA в eclipse и экспортировал банку (не работающую банку). Я отключил параметры файлов .project и .classpath при экспорте. Теперь я пытаюсь запустить эту банку и получаю NoClassDefFoundError:

Я вставляю команду и ошибки ниже:

C:\Users\Anjali>"C:\Program Files\Java\jre7\bin\java.exe" -classpath D:\Web\Hbas
eGateway\bin;C:\Users\Anjali\Downloads\Hbase\hbase-0.94.5-security.jar;C:\Users\
Anjali\Downloads\Hbase\lib\hadoop-core-1.0.4.jar;C:\Users\Anjali\Downloads\Hbase
\py4j0.7.jar -jar D:\Web\HbaseGateway\bin\HBaseGateway.jar
Exception in thread "main" java.lang.NoClassDefFoundError: py4j/GatewayServer
        at hbase.gateway.HBaseGatewayEntryPoint.main(HBaseGatewayEntryPoint.java
:22)
Caused by: java.lang.ClassNotFoundException: py4j.GatewayServer
        at java.net.URLClassLoader$1.run(Unknown Source)
        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)
        ... 1 more

Теперь интересно то, что я могу запустить основной класс, используя следующую команду. В приведенной ниже команде я удалил переключатель -jar и передал основной класс java.exe.

C:\Users\Anjali>"C:\Program Files\Java\jre7\bin\java.exe" -classpath D:\Web\Hbas
eGateway\bin;C:\Users\Anjali\Downloads\Hbase\hbase-0.94.5-security.jar;C:\Users\
Anjali\Downloads\Hbase\lib\hadoop-core-1.0.4.jar;C:\Users\Anjali\Downloads\Hbase
\py4j0.7.jar hbase.gateway.HBaseGatewayEntryPoint
Gateway Server Started

Почему NoClassDefFoundError бросают? Я что-то упустил здесь?


person Mayank    schedule 13.04.2013    source источник


Ответы (2)


Чтобы опция -jar работала, вы должны добавить ключ Main-class в манифест. См. документацию по командам Java http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html

опция -jar

Выполнение программы, инкапсулированной в файле JAR. Первый аргумент — это имя файла JAR вместо имени класса запуска. Чтобы эта опция работала, манифест файла JAR должен содержать строку вида Main-Class: classname. Здесь classname идентифицирует класс, имеющий метод public static void main(String[] args), который служит отправной точкой вашего приложения.

person Jaydeep Rajput    schedule 13.04.2013
comment
У меня есть файл манифеста с основным классом как hbase.gateway.HBaseGatewayEntryPoint... Но у меня не установлен jdk. Это имеет значение? - person Mayank; 13.04.2013
comment
В идеале не должен. Попробуйте запустить команду java без каких-либо параметров. Проверьте, отображается ли в справке параметр -jar или нет. - person Jaydeep Rajput; 13.04.2013
comment
Поскольку ошибка исходит из основного класса, это не проблема Main-Class, как также говорится в OP. - person NilsH; 13.04.2013

При использовании параметра -jar путь к классам также считывается из файла MANIFEST.mf. Из документов для опции -jar:

При использовании этого параметра файл JAR является источником всех пользовательских классов, а другие параметры пути к пользовательскому классу игнорируются.

Это означает, что вы должны добавить все свои зависимости в раздел Class-Path файла манифеста.

person NilsH    schedule 13.04.2013