Почему мой толстый JAR не работает на разных компьютерах - основной класс не найден? - PullRequest
2 голосов
/ 23 октября 2019

Я создал артефакт javaFX, используя IntelliJ. Моя первая проблема была в поле «Класс приложения», где он не определял мой основной класс автоматически или даже не предлагал какие-либо классы в качестве основного класса при поиске в окне поиска. Я увидел, что это была ошибка с IntelliJ, где-то в StackOverflow, и я просто вручную ввел свой packageName.Main в поле класса приложения.

У меня есть две зависимости, которые я извлек в это выходной корень. Вывод сборки артефакта выглядит следующим образом: this.

Затем после перестройки проекта JAR запускается на моем ПК на 100%, даже если я переместилJAR в другой каталог, он работает на 100%.

Итак, я скопировал этот JAR (Swansong.jar) на мой другой компьютер, и когда я дважды щелкнул по нему, ничего не произошло. Когда я запустил его в cmd: java -jar Swansong.jar, я получил эту ошибку:

Error: Could not find or load main class swansong.Main
Caused by: java.lang.ClassNotFoundException: swansong.Main

Я читаю о файлах манифеста, но не могу найти файл манифеста нигде в своем проекте, но если я извлекаю JARФайл сгенерированного файла манифеста выглядит как this . Может кто-нибудь помочь мне, почему JAR работает на одном компьютере, а не на другом? И как я могу это исправить?

ОБНОВЛЕНИЕ: Это - это содержимое моего jar-файла, а this - это содержимое каталога swansong внутри jar-файла.

ОБНОВЛЕНИЕ 2: Я чувствую себя глупо. Мой основной компьютер работает с jdk8, а другой - с jdk11. И JavaFX не входит в jdk11. Так что я думаю, что это проблема, но пока не уверен на 100%. Проверим и посмотрим. Есть ли обходные пути для этого?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2019

Ненавижу это признавать, но решение проблемы все время смотрело мне в лицо, и я действительно смущен. Я использовал Java 8 для разработки программы. Целевой ПК использовал Java 11, и я никогда не думал проверять версию JDK, потому что думал, что использую JDK8 на обоих ПК.

JavaFX включен в JDK8, но не в JDK11. Он должен быть добавлен в проект как внешняя библиотека при использовании более новых версий JDK. Я просто использовал JDK8 для запуска программы, и все работает на 100%. Спасибо за ответы и комментарии, хотя я многое узнал о манифестах и ​​путях к классам, пытающихся решить эту проблему, поэтому усилия были не напрасны!

0 голосов
/ 23 октября 2019

Любой исполняемый файл JAR должен иметь файл манифеста, который указывает на основной класс.

-JAR File
 \---META-INF
   \--MANIFEST.MF

В файле MANIFEST.MF вы должны представить основной класс следующим образом:

    Main-Class: com.mycompany.MainClass
    Class-Path: . 

com.mycompany.MainClass следует заменить соответствующим путем (полное имя вашего основного класса)

...