Java 9 JRE вызывает java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils при выполнении jar

Я создал файл jar на Eclipse Oxygen.1a (ОС: Windows 10 Home edition, 64-разрядная версия). JRE моего проекта - jre1.8.0_152 (64-разрядная версия). Когда я запускаю свой файл jar с помощью Java 8 JRE, программа работает отлично, но когда я использую Java 9 JRE, я получаю следующую ошибку:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils

Эта ошибка возникает при выполнении: java -jar myjarfile.jar с использованием Java 9 JRE.

Я внедрил последнюю версию Apache Commons Lang (в библиотеки проектов добавлен commons-lang3-3.7.jar) и использовал последнюю версию Java 9 Runtime (jre9.0.1 ). На странице Apache указано, что требуется Java 7.0+.
Есть ли проблема несовместимости между Java 9 и библиотеками Apache Commons? Как это решить?

Обновление:
Командная строка содержит (представление "Отладка", щелкните правой кнопкой мыши и выберите "Свойства").

"C:\Program Files\Java\jre1.8.0_152\bin\javaw.exe" 
-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:50317 
-Dfile.encoding=UTF-8 
-classpath "C:\Program Files\Java\jre1.8.0_152\lib\resources.jar;
C:\Program Files\Java\jre1.8.0_152\lib\rt.jar;
C:\Program Files\Java\jre1.8.0_152\lib\jsse.jar;
C:\Program Files\Java\jre1.8.0_152\lib\jce.jar;
C:\Program Files\Java\jre1.8.0_152\lib\charsets.jar;
C:\Program Files\Java\jre1.8.0_152\lib\jfr.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\access-bridge-64.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\cldrdata.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\dnsns.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\jaccess.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\jfxrt.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\localedata.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\nashorn.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\sunec.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\sunjce_provider.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\sunmscapi.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\sunpkcs11.jar;
C:\Program Files\Java\jre1.8.0_152\lib\ext\zipfs.jar;
C:\my Java lab\Eclipse Oxygen\Workspaces\JNotifier\JNotifier\bin;
C:\my Java lab\Eclipse Oxygen\Workspaces\JNotifier\JNotifier\src\libPack\commons-lang3-3.7.jar" libPack.JCostCalculator

Jar-файл, созданный путем экспорта исполняемого JAR-файла с помощью Eclipse с использованием следующих параметров:
Настройки экспорта JAR-файлов

Второе обновление: я протестировал свой JAR на другой 64-разрядной системе Windows 10 pro и на Ubuntu 16.04.3 LTS с Java 9 и столкнулся с той же проблемой.


person Zerthimon    schedule 19.11.2017    source источник
comment
commons-lang3-3.7.jar отлично работает на моей стороне. Не могли бы вы сделать следующее: 1) Запустите приложение, 2) Когда оно завершится, откройте представление отладки, щелкните правой кнопкой мыши ‹terminated, exit value: ...› и нажмите «Свойства», 3) Скопируйте все из командной строки и вставьте здесь в вопросе.   -  person ZhekaKozlov    schedule 19.11.2017
comment
Я создал файл jar. Вы имеете в виду использование Eclipse? Не могли бы вы поделиться шагами, которые вы выполнили?   -  person Naman    schedule 19.11.2017
comment
@ZhekaKozlov Я обновил свой пост. Комментарии имеют максимальное количество символов.   -  person Zerthimon    schedule 19.11.2017
comment
@nullpointer Я обновил свой пост, указав действия по созданию jar, которые я сделал.   -  person Zerthimon    schedule 19.11.2017
comment
@Zerthimon Из вашей командной строки не похоже, что вы работаете из JAR. Вместо этого вы работаете из папки bin.   -  person ZhekaKozlov    schedule 19.11.2017
comment
@ZhekaKozlov, возможно, мой пост не ясен на 100%. Я получаю сообщение об ошибке вне Eclipse НЕ внутри, когда я компилирую/запускаю свой класс. Когда я запускаю из командной строки (Windows) или терминала (Linux): java - jar myjarfile.jar с использованием Java 9 JRE, я всегда получаю эту ошибку. В Java 8 JRE НЕТ ошибки, и мое приложение работает нормально.   -  person Zerthimon    schedule 20.11.2017
comment
@nullpointer Eclipse использует JRE, а не JDK. В любом случае я запускаю свой JAR-файл не из Eclipse, а как автономное исполняемое приложение в Windows или Linux.   -  person Zerthimon    schedule 20.11.2017
comment
Если вы имеете в виду, что создали банку с помощью JRE8 в eclipse и теперь пытаетесь запустить банку с помощью команды JDK9/bin/jar, убедитесь, что в вашем проекте нет конфликтующих зависимостей, которые разрешаются в StringUtils из commons3. Кроме того, NoClassDefFoundError может быть возможен и с неправильной упаковкой, подробности которой не раскрываются в вопросе.   -  person Naman    schedule 20.11.2017
comment
@Zerthimon Содержит ли ваш JAR org.apache пакетов? Вы можете проверить это? Вы можете просто распаковать его как zip-файл.   -  person ZhekaKozlov    schedule 20.11.2017
comment
@ZhekaKozlov ваш комментарий сгенерировал решение. Java 9 JRE требует, чтобы библиотеки внутри JAR были извлечены, а не упакованы. Теперь при распаковке видна папка org (org.apache...) вместо commons-lang3-3.7.jar. Спасибо.   -  person Zerthimon    schedule 20.11.2017


Ответы (1)


Решение, наконец, найдено после тщательного изучения комментариев пользователей. Проблема решена, когда я выбрал «Извлечь необходимые библиотеки в сгенерированный JAR» вместо «Упаковать их». введите описание изображения здесь Теперь мой файл jar отлично работает с Java 8 и Java 9 JRE. Протестировано на моих станциях Linux и Windows (32 и 64 бит).

Я считаю, что суть проблемы заключалась в том, что Java 9 JRE не могла обнаружить библиотеку Apache Commons Lang в форме JAR (commons-lang3-3.7.jar). Когда содержимое commons-lang3-3.7.jar было извлечено в мой JAR, проблема решена!

person Zerthimon    schedule 20.11.2017
comment
Я сомневаюсь, что это проблема JDK 9, это больше похоже на то, что Eclipse не помещает commons-lang3.3.7.jar в путь к классам. Было бы полезно попробовать это вне среды Eclipse, чтобы посмотреть, сможете ли вы воспроизвести проблему. - person Alan Bateman; 20.11.2017
comment
@AlanBateman Eclipse Oxygen запущен со многими проблемами с Java 9, так что, вероятно, это ошибка Eclipse. Я воспроизведу проблему, используя среду IDE NetBeans 8.2, и опубликую результаты. - person Zerthimon; 20.11.2017
comment
Если вы подозреваете ошибку Eclipse, сообщите об этом по адресу bugs.eclipse.org/bugs. /enter_bug.cgi?product=JDT, TIA. - person Stephan Herrmann; 20.11.2017
comment
Ваш обходной путь указывает, что, вероятно, класс org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader не полностью функционален в Java 9, поэтому, если вы сообщаете об ошибке, включите трассировку стека NCDFE, чтобы увидеть, действительно ли этот класс задействован. - person Stephan Herrmann; 20.11.2017