https://psiola-center.ru/wp-content/uploads/8/1/1/81134bcfd8aedee7cf9ebe292a83861f.jpeg
https://psiola-center.ru/wp-content/uploads/8/1/1/81134bcfd8aedee7cf9ebe292a83861f.jpeg

Постановка цели

Как я уже писала в своей предыдущей статье, недавно, после двухлетнего обучения (обещали 12 месяцев, но жизненные и геополитические обстоятельства внесли свои коррективы в сроки получения дополнительного образования), я стала java-разработчиком.

Завершение обучения требовало написания выпускного проекта, которым я, изрядно поразмыслив, решила «убить сразу несколько зайцев»:

  • проект должен быть написан мной самостоятельно (без команды),

  • быть законченным и полноценным с точки зрения «бэка и фронта»,

  • функционал проекта должен нести какую-то информативную пользу,

  • проект станет подарком на день рождения.

Вспомнив все, чему меня "пытались научить", я решила, что за 1,5 месяца, отведенных на выпускную работу (с учетом загруженности по основному месту своей занятости), я вполне самостоятельно справлюсь с написанием оконного приложения для рабочего стола по предоставлению пользователю текущих и прогнозных значений погоды. Оболочку приложения решила выполнить на JavaFX, а для получения данных о погоде использовать JSON.

Когда я выслала преподавателю техническое задание с характеристиками проекта, он, восседая на удобном кресле где-то в пригороде германского города Мюнхен, меня, великовозрастную студентку из Санкт-Петербурга, «обрадовал и окрылил» тем, что знания по JavaFX в реальной жизни мне не пригодятся, и я рискую впустую потратить время…

Ну что же, такая откровенность на завершающей стадии обучения, конечно, похвальна. Осознав, что целый курс, посвященный разработке приложения на JavaFX, получается, еще год назад был пустой тратой времени, я решила не отступаться и попробовать реализовать задуманное. 

Процесс и трудности, с которыми пришлось столкнуться

Не особо вдумываясь в тонкости платформы JavaFX и ее представлении в выпусках Java-8, я решила писать приложение на JDK-1.8 в среде разработки IntelliJ IDEA Community Edition, используя maven.

Начиная создавать проект стандартным путем и пытаясь упростить себе жизнь, я выбрала настройки, как показаны на скриншоте: 

 и, нажав на кнопку «Next», получила неожиданное для себя сообщение:

Да-да, я не знала той тонкости, что JavaFX, представленный как часть выпуска Java-8, был удален из JDK и перенесен в отдельный модуль в Java-11.

Ну что же, начав все сначала, я выбрала JDK-11.0.2, и у меня чудесным образом создался проект с необходимыми классами и ресурсными файлами, со всеми нужными зависимостями и способами сборки, автоматически прописанными в pom.xml файле: 

 Чтобы проверить, действительно ли работает минимальный функционал будущего приложения, я запустила класс HelloApplication.java и получила результат, свидетельствующий, что все в порядке: 

Далее была длительная полуторамесячная работа над проектом, в процессе которой:

  • я внесла изменения в базовый код, сформированный IntelliJ IDEA автоматически,

  • создала сцены с помощью JavaFX Scene Builder 2.0,

  • установила получение информации по JSON,

  • и прочее, прочее, прочее… пока в среде разработки все не начало запускаться, открываться и отображаться так, как мне бы хотелось.

С финальной версией проекта и демонстрацией его возможностей можно ознакомиться на GitHub.

Теоретически, проект готов, образовательная цель достигнута, его можно сдать как выпускную работу и выдохнуть.

Но, не забываем, программа должна была стать подарком на день рождения. У именинника не установлена Java, чтобы запустить jar-файл проекта и наслаждаться результатом работы приложения. Значит, нужно собрать проект в исполняемый .exe файл, который будет запускаться на любом устройстве с установленной системой Windows.

«Ерунда какая!» - подумала я, - «У меня же IntelliJ IDEA, она все сама соберет и подскажет, в случае чего».

Захожу в File -> Project Settings -> Artifacts -> JavaFx application -> From Module ‘имя модуля’

Добавляю к артефакту всю библиотеку зависимостей, что у меня есть в проекте (краем глаза вижу красные символы, которые должны бы вызвать тревогу и заставить меня призадуматься, но я так увлечена процессом, что не придаю им значения):

Заполняю сведения об основном классе, который запускает приложение (поле Application class): 

 В той же вкладке указываю значение «all» в поле Native bundle и применяю настройки: 

 После вхожу в режим Build -> Build Artifacts, выбираю только что созданный артефакт и… получаю сообщение, что используемая версия JDK не способна собрать мой проект в необходимый пакет: 

Начитавшись всего, чего только возможно, во всемирной паутине, я решаюсь на эксперимент:

1. Заменила в pom.xml файле версию Java 11 на 8, обновилась: 

2. В File -> Project Structure -> Project указала корректную версию используемой SDK:

3. Закомментировала (можно удалить) файл module-info.java, сформированный Java-11 автоматически при создании проекта: 

4. Проверила, запускается ли приложение до сборки: 

 5. Описанными выше способами снова создала и собрала артефакт. Но! – опять получила ошибку: 

 6. После непродолжительных поисков причины я поняла, что на ноутбуке, на котором написана моя программа, собрать ее в исполняемый .exe файл у меня пока не получится, т.к. в наименовании пути к директории не должно быть ни кириллицы, ни специальных символов:

И изменение имени учетной записи Windows вручную не приведет к изменению имени пользовательской папки.

 7. Не рискнув «копаться в мозгах» установленной на ноутбуке операционной системы, я воспользовалась стационарным компьютером, не имеющим в наименовании директорий кириллицу, и спокойно собрала проект.

Запускаемый .exe файл располагается в папке out\artifacts\название артефакта\bundles\название проекта: 

Вместо заключения

При кажущейся простоте создания приложения на JavaFX (особенно с помощью JavaFX Scene Builder 2.0 и бесплатных видео-уроков на различных ресурсах), написание функционала программы – это только половина пути. Программа должна работать, жить своей жизнью самостоятельно, без привязки к среде разработки. И, как показывает мой личный опыт, при сборке проекта и выпуске его в «большой мир» приходится преодолевать немало терний.

Надеюсь, что моя статья поможет кому-нибудь избежать ошибок, найти ответы на вопросы или просто сразу пойти правильным путем (например, создавать обычный maven-проект на Java-8, вручную прописывая в pom.xml зависимости и способ сборки, и всегда указывать на латинице имена учетных записей, директорий в своей операционной системе).

Комментарии (17)


  1. RusTech
    00.00.0000 00:00
    +1

    Почему просто не переложили проект в другую папку, без кириллицы?


    1. Polesmih Автор
      00.00.0000 00:00
      -2

      Потому что дело не в том, в какой папке сам проект, а в том, где установлена IntelliJ IDEA (на скрине виден путь в сообщении об ошибке), которая собирает проект.

      У меня она установлена на диске С, в директории Users\ОиК..., где ОиК - это имя пользователя, которое я "по дурости" когда-то давно присвоила в системе после покупки ноутбука при первичном запуске Windows.


      1. LeshaRB
        00.00.0000 00:00

        Idea разве не в Program Files ставиться?

        Ну да ладно. Idea всего лишь инструмент... А почему нельзя было собрать exe без него?


        1. sshikov
          00.00.0000 00:00
          -1

          IDEA поставляется в виде .zip (в том числе). И устанавливается путем распаковки куда угодно.


      1. sshikov
        00.00.0000 00:00

        IDEA точно так же перекладывается в любую другую папку, откуда успешно запускается.


        1. Polesmih Автор
          00.00.0000 00:00

          Дело не в том, куда предустановлена IDEA, дело в системной папке AppData (на скрине с ошибкой как видно, что она располагается в директории с названием на кириллице). Перенести содержимое AppData и изменить настройки Windows по указанию нового расположения этой папки я не решилась, тем более, что был другой компьютер без таких нюансов. А наименование директории, где хранится AppData, - это реальная проблема, с которой сталкиваются начинающие разработчики, если судить по тем форумам, что я находила


          1. sshikov
            00.00.0000 00:00

            а в том, где установлена IntelliJ IDEA
            Заметьте, не я это сказал...

            Я работаю с IDEA примерно с момента ее появления — ну может чуть меньше, но это все равно уже 20 лет. И никогда не было никаких проблем с переносом дистрибутива в другое место. А эта ваша папка с конфигами задается всего лишь свойством в idea.properties — почти наверняка. Или там лежит какой-то кеш. В user.home никогда ничего постоянного не было.


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


  1. Breathe_the_pressure
    00.00.0000 00:00

    А например Launch4j или Warp-packer не подходит?


    1. Polesmih Автор
      00.00.0000 00:00
      -2

      Пробовала Launch4j - результат был нулевой. Глубоко копать не стала, т.к. хотелось, чтобы все писалось и собиралось из IntelliJ IDEA (поиск наиболее простого пути:))


      1. Breathe_the_pressure
        00.00.0000 00:00

        Бггг, "простого пути". Я как-то неделю копался с ошибкой кода, оказалось что студию надо было просто обновить. Продукт то хороший, не жалуюсь, но даже с ним бывают непростые ситуации.


      1. aleksandy
        00.00.0000 00:00
        +1

        Вот простой путь.


  1. Polesmih Автор
    00.00.0000 00:00

    комментарий удален как дублирующий


  1. auresio
    00.00.0000 00:00
    +3

    Глядя на все эти прыжки с подвывертами Delphi просто грустно и сочувственно улыбается.


  1. ris58h
    00.00.0000 00:00
    -1

    Какой смысл КДПВ?

    UPD: вроде как это скрин приложения, но из текста статьи это непонятно.


    1. Polesmih Автор
      00.00.0000 00:00

      Да, это скрин окна приложения. Учту на будущее


  1. jreznot
    00.00.0000 00:00
    -2

    В шаблоне проекта у IntelliJ есть javafx плагин.

    И можно просто пойти в Maven тулокно и выбрать там Plugins - javafx - javafx:jlink

    В результате получите каталог с .exe и всем нужным, и вам не придется даунгрейдится на Java 8.


  1. AlexFuryBestForever
    00.00.0000 00:00

    Молодчина, взяла и сделала! Поздравляю с почином и желаю долгих лет и проекту и вам как разработчику)