Попытка запустить класс, зависящий от POI, в командной строке

Как следует из названия, я пытаюсь запустить класс в командной строке, который использует библиотеку Apache POI, но когда я запускаю эту команду:

java -cp C:\Users\rperera\IdeaProjects\LinkingNames\libs; HyperlinkWriter

Я получаю эту ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/CreationHelper
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at java.lang.Class.getMethod0(Unknown Source)
    at java.lang.Class.getMethod(Unknown Source)
    at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
    at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.CreationHelper
    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)
    ... 6 more   

папка libs содержит всю папку POI, которая заархивирована при загрузке, поэтому я не уверен, почему она выдает эту ошибку. Я также протестировал это с IntelliJ, и он работал нормально. Я знаю, что командная строка и IntelliJ обрабатывают библиотеки по-разному, но я не уверен, почему это происходит.

Буду признателен за любую помощь! Спасибо!


person silverAndroid    schedule 05.08.2015    source источник
comment
Распакована ли библиотека, содержащая банки POI?   -  person andrewdleach    schedule 05.08.2015
comment
Просто чтобы уточнить, вы спрашиваете, расстегнуты ли банки?   -  person silverAndroid    schedule 05.08.2015
comment
да, скачанная вами папка с библиотекой POI распакована?   -  person andrewdleach    schedule 05.08.2015
comment
Банки все еще застегнуты, но poi-bin-3.12-20150511.zip не застегнуты.   -  person silverAndroid    schedule 05.08.2015
comment
Все ли файлы .jar из вашей загрузки находятся в этом каталоге, например. пои-3.12-20150511.jar и т.д.?   -  person rgettman    schedule 05.08.2015
comment
Я бы проверил наличие дополнительных банок POI. У меня была аналогичная проблема с использованием сборки maven, и были объявлены конфликтующие версии. Если у вас есть более одной банки, содержащей класс org.apache.poi.ss.usermodel.CreationHelper, я бы ожидал java.lang.ClassNotFoundException:   -  person BoatCode    schedule 05.08.2015
comment
@rgettman все файлы .jar из загрузки находятся в каталоге   -  person silverAndroid    schedule 05.08.2015
comment
@BoatCode я проверил дополнительные банки POI, но не нашел дополнительных банок, содержащих класс   -  person silverAndroid    schedule 05.08.2015
comment
Банок в каталоге обычно недостаточно. Что произойдет, если вы явно перечислите их в пути к классам?   -  person Gagravarr    schedule 06.08.2015


Ответы (2)


Вам нужно фактически скомпилировать банку с исходными файлами .java и указанными банками POI.

javac -cp \path_to_jars \path_to_java_files

а потом

java MyProject
person andrewdleach    schedule 05.08.2015
comment
Пробовал javac -cp C:\Users\rperera\IdeaProjects\LinkingNames\libs C:\Users\rperera\IdeaProjects\LinkingNames\src\HyperlinkWriter.java но выдавало кучу ошибок из-за того что компилятор жаловался что пакетов POI не существует - person silverAndroid; 06.08.2015
comment
Вы удалили лишние файлы .class? - person andrewdleach; 06.08.2015
comment
Я удалил все сгенерированные IntelliJ, но все еще получаю ошибки - person silverAndroid; 06.08.2015
comment
Не только компилировать, но и запускать! Вам также нужны эти jar-файлы, перечисленные в пути к классам, для команды времени выполнения java! - person Gagravarr; 06.08.2015
comment
@Gagravarr Я знаю это, но я не могу запустить его, пока не скомпилирую - person silverAndroid; 06.08.2015

Я нашел ответ в предыдущем ответе StackOverflow. Мне пришлось добавить '*' в конец и '.' после точки с запятой. Итак, в моем примере с точки зрения компиляции мне пришлось сделать:

javac -cp C:\Users\rperera\IdeaProjects\LinkingNames\libs\*;. C:\Users\rperera\IdeaProjects\LinkingNames\src\HyperlinkWriter.java

а затем, чтобы запустить его (Спасибо @andrewdleach), я просто сделал:

java HyperlinkWriter
person silverAndroid    schedule 06.08.2015