java 1.8 jar работает в Windows, а не в Ubuntu, "не удалось найти или загрузить основной класс ..." - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть jar-файл, который отлично работает из командной строки Windows 10, но не работает в командной строке Ubuntu 18.04 на моем рабочем столе. Файл был экспортирован из Eclipse в виде jar-файла и скопирован в Ubuntu. В проекте около 30 классов, более полудюжины пакетов. Я сделал несколько переименований, чтобы упростить этот вопрос.

Это команда, используемая для запуска jar:

java -jar myproject.jar

В Ubuntu я получаю сообщение об ошибке "Не удалось найти или загрузить основной класс com.abLaunchThis "

Ниже приведены некоторые вещи, которые я пробовал, основываясь на предложениях из многих похожих постов. Извините, если это дубликат, но я не смог найти работоспособного ответа.

Я проверил, что текущий Java равен 1,8, используя команды:

$ update-alternatives --config java

и

$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

(я также проверил, что программа работает с использованием java 8 на Windows.)

Я выполнил следующую проверку, которая отображает все файлы, и подтвердил, что com / a / b / LaunchThis.class существует и пишется точно так же.

java tj myproject.jar

Манифест кажется правильным.

Manifest-Version: 1.0
Main-Class: com.a.b.LaunchThis

Я также попытался распаковать jar и запустить программу прямо из папка / myproject, которая содержит / com и META-INF. Это должно работать, не так ли?

java com.a.b.LaunchThis
java com/a/b/LaunchThis
java com.a.b/LaunchThis

И с одного уровня вне папки myproject:

java myproject/com/a/b/LaunchThis
java myproject.com.a.b/LaunchThis
java myproject.com.a.b.LaunchThis
java myproject/com.a.b.LaunchThis

Я не совсем понимаю, когда требуется синтаксис. или /. Команда пакета в «LaunchThis», которая содержит основную точку входа, следующая:

package com.a.b;

И в каждой из вышеперечисленных итераций я также пытался включить «-cp myproject.jar» в качестве опции.

Всегда одно и то же сообщение об ошибке.

Чтобы избежать опечаток, указанных выше, я сначала выполнил команду ls, чтобы убедиться, что файл можно найти (затем отредактировал эту строку, чтобы создать варианты).

ls myproject.com.a.b.LaunchThis.class

Какие-либо предложения относительно того, что еще попробовать?

Для ухмылки, запуск с Java11 получает этот ответ:

Error: Could not find or load main class com.a.b.LaunchThis
Caused by: java.lang.NoClassDefFoundError: javafx/event/EventHandler

Это делает некоторые смысл, потому что Java11 не включает в себя JavaFX. Но Java 8 действительно включает EventHandler. Это было частью Java начиная с JavaFX 2.

ОБНОВЛЕНИЕ: Я сделал два баночка "Hello world", один с JavaFX и один без него в Ubuntu Eclipse, работающем под управлением OpenJDK 8. Чтобы получить версию с Чтобы запустить JavaFX, я скачал Oracle JDK 1.8 и связал его с /lib/etc/jfxrt.jar в виде библиотеки "external jar". Обе программы работают в Eclipse, но работает только jar без FX. Фляга FX выдает точно такое же сообщение об ошибке.

Я думаю, это в значительной степени устанавливает мою проблему, заключающуюся в отсутствии JavaFX в составе OpenJDK 8.

Я планирую попробовать сейчас два решения: (1) копирование Oracle jfxrt.jar в библиотеку OpenJDK, (2) обратная загрузка OpenJFX 8.

Простая установка OpenJFX из репозитория загружает OpenJFX 11, который немного устарел, но будет работать с OpenJDK 11.

1 Ответ

0 голосов
/ 27 апреля 2020

Проблема здесь в том, что репозиторий OpenJDK 8 в Ubuntu 18.04 не включает JavaFX. Я предполагаю, что сообщение об ошибке связано с тем, что функция main () JavaFX расположена в классе, который расширяет класс приложения JavaFX.

Как это исправить?

Есть количество вещей, которые я тестировал.

Во-первых, один может использовать вместо JDK 1.8 Oracle. Я исключил это из-за проблем с лицензированием.

Некоторые сайты предлагали скопировать jfxrt.jar из Oracle JDK 1.8 или из работающей программы Java, которая использует JavaFX и использует автономная JRE. Я обнаружил, что если бы я связался с Oracle jfxrt.jar (находится в папке /jre/lib/ext) в качестве внешнего jar-файла, я мог бы запустить простую программу "Hello world" на Java в Eclipse. Но я не смог запустить программу после ее экспорта в jar.

В одном ответе по связанному потоку stackoverflow предлагалось скопировать несколько дополнительных файлов вместе с jfxrt.jar, который я пробовал. Это не сработало, поэтому я не собираюсь об этом говорить.

Наиболее удачное решение пришло по ссылке, приведенной в комментарии @ dave_thomson_085, Как мне получить Java FX работает с OpenJDK 8 в Ubuntu 18.04.2 LTS? .

Этот ответ включает в себя очистку и переустановку openjfx с более старой версией и пометку, что она НЕ подлежит обновлениям .

Код, предоставленный Вольфгангом Фалем (которому он приписывает Druidefix ), следующий:

apt purge openjfx
apt install openjfx=8u161-b12-1ubuntu2 libopenjfx-jni=8u161-b12-1ubuntu2 libopenjfx-java=8u161-b12-1ubuntu2
apt-mark hold openjfx libopenjfx-jni libopenjfx-java

Теперь я могу запускать и тестировать jar-файлы, содержащие Java8, используя JavaFX, который были созданы на моем Windows Eclipse, на моем рабочем столе Ubuntu.

Я получаю предупреждающее сообщение, с которым я еще не справился:

Gtk-Message: 13:25:40.829: Failed to load module "canberra-gtk-module"

Но это не мешает моему запуск программ.

...