Статьи

Создание архетипа Maven из проекта #KFCStandard JavaFX

В этой статье я расскажу о создании архетипа Maven, который мои ученики или кто-либо другой может использовать для начала разработки приложения JavaFX. Как и многие приключения в программировании, этот процесс начался быстро, а затем увяз в работе с конкретными деталями. Если вы хотите создать свой собственный архетип, эта статья будет вам полезна. Не забудьте прочитать раздел Sip of Whine в конце.

Исходный код для примера проекта JavaFX находится по адресу https://github.com/omnijava/SimpleJavaFX.

Папка архетипа, готовая для установки в вашей системе, находится в выпуске https://github.com/omnijava/ArchetypeJavaFX/releases.

Шаг 1: Написать программу

Архетипы могут быть созданы с использованием подхода снизу вверх или сверху вниз. Безусловно, самый простой подход — сверху вниз. Вы начинаете с написания очень простого приложения JavaFX, управляемого Maven. Вы предоставляете скелет приложения, которое содержит требуемые или рекомендуемые пакеты, ресурсы и исходный код.

Приложение, которое я создал, представляет собой простую JavaFX Stage с одной сценой с кнопкой, которая при нажатии отображает некоторый текст. Код, который предоставляет этот опыт, находится в формате, которому я хочу, чтобы мои ученики следовали. Несколько лет назад некоторые студенты создали хеш-тег, чтобы высмеять мои строгие правила, #KFCStandard. Что я, как я описываю любые правила или инструкции, которые я даю студентам, которые должны соблюдаться. Этот проект иллюстрирует ряд #KFCStandards в области файлов pom, как запустить приложение JavaFX, как выполнить модульное тестирование и как комментировать код. Если вы не один из моих учеников, у вас могут возникнуть проблемы с моим архетипом. Мне бы очень хотелось услышать ваши мысли. Живя в академической среде, я переживаю, что теряю сайт реального мира разработки программного обеспечения.

Сделайте все возможное, чтобы программа работала. Если вы создаете архетип, в котором файлы пусты, ожидая, пока пользователь их заполнит, то это, вероятно, не будет проблемой. Если ваш код что-то делает, как мой, потратьте некоторое время на то, чтобы сделать это правильно.

Архетип Совет № 1 : Всегда создавайте пакеты, которые начинаются с maven groupId и, необязательно, artifactId . Это позволяет пользователю вашего архетипа использовать собственные имена пакетов.

Совет № 2 для архетипа : Если вы ссылаетесь на mainClass в pom.xml как:

        <mainClass>com.kfcstandard.javafxarchetype.MainAppFX</mainClass>

Измените это на

        <mainClass>${groupId}.${artifactId}.MainAppFX</mainClass>

Совет № 3 для архетипа : если вам нужен пакет, созданный при использовании архетипа, но вам нечего поместить в пакет, добавьте пустой файл. Maven не будет создавать пакеты, если в нем нет файлов.

Примечание pom.xml: Когда я компилирую с NetBeans, я получаю два предупреждения относительно pom.xml. Один говорит мне, что $ {groupId} устарел в пользу $ {project.groupId}, а второй говорит мне, что $ {artifactId} устарел в пользу $ {project.artifactId}. Редактор NetBeans 8.01 распознает только $ {project.groupId}, а не другой. Поэтому сейчас я использую устаревшие версии.

Шаг 2: Установите Maven

Я использую NetBeans, мои личные предпочтения в IDE и то, что я использовал при разработке архетипического кода. В одном курсе, который я преподаю, я должен использовать Eclipse. Оба эти IDE и другие в настоящее время обеспечивают хорошую поддержку Maven. Люди, которые знают меня, теперь закатят глаза, когда я скажу, что создать архетип легче в командной строке. Загрузите и установите Maven с https://maven.apache.org/download.cgi . Прочтите примечания по установке по адресу https://maven.apache.org/install.html . У вас должна быть папка bin Maven в пути к исполняемому файлу, а пользователи Windows должны иметь переменную среды JAVA_HOME .

Примечание Maven : некоторые IDE, такие как NetBeans, содержат программу командной строки maven. Я рекомендую скачать Maven, чтобы вы работали с самой последней версией.

Шаг 3: Очистить проект

Найдите папку, в которой находится ваш проект. Удалите все в папке проекта, кроме папки src и файла pom.xml . Возможно, вы захотите сделать копию папки проекта, потому что вы будете изменять один файл, который вызовет исключение, если вы запустите проект после изменения.

Шаг 4: измените файл fxml

Если вы создаете проект с файлом fxml в папке ресурсов, он, вероятно, содержит ссылку на свой файл контроллера Java. В этом проекте файл Scene.fxml содержит:

FX: контроллер =»com.kenfogel.archetypejavafx.controllers.FXMLController»>

Вам необходимо заменить часть пакета, которая соответствует groupId и artifactId, соответствующими свойствами. Изменение выглядит так:

FX: контроллер =». $ {идентификатор_группы} $ {артефакт} .controllers.FXMLController»>

Шаг 5: Разрешение архетипа или создание архетипа

Разрешение архетипа — это термин, который разработчики Maven используют для описания использования Maven для создания архетипа. Эта задача создаст новую целевую папку, содержащую версию вашего кода в виде архетипа.

Откройте командное окно в корневой папке проекта. В моем случае это D: \ mvnbuild \ ArchetypeJavaFX. В командной строке введите команду:

mvn archetype:create-from-project

Вы можете игнорировать все предупреждения.

Если все прошло хорошо, у вас будет следующая папка, которая обычно не является частью сборки Maven:

D: \ NetBeansProjects \ javafxarchetype \ цель \ генерируемой Sources \ архетип

Шаг 6: Сделайте FXML-файлы фильтруемыми

Проект в папке archetype теперь содержит два файла с именем archetype-metadata.xml . Этот XML-файл определяет, какие файлы войдут в архетип и будут ли они отфильтрованы. Фильтрация — это замена свойства значением. Вот почему мы изменили файл Scene.fxml на предыдущем шаге. В архетипе-Metadata.xml файлы не показывают , что файлы в FXML папке ресурсов фильтрованию. Найдите эти два файла, мои находятся в:

D: \ NetBeansProjects \ javafxarchetype \ целевой \ сгенерированные-источники \ архетип \ SRC \ Главная \ Resources \ META-INF \ Maven

И

D: \ NetBeansProjects \ javafxarchetype \ цель \ генерируемой Sources \ архетип \ целевых \ Классы \ META-INF \ Maven

Отредактируйте файлы, они идентичны, чтобы изменить:

<fileSet encoding="UTF-8">
   <directory>src/main/resources</directory>
   <includes>
      <include>**/*.fxml</include>
      <include>**/*.css</include>
   </includes>
 </fileSet>

читать

<fileSet filtered="true" encoding="UTF-8">
   <directory>src/main/resources</directory>
   <includes>
      <include>**/*.fxml</include>
      <include>**/*.css</include>
   </includes>
</fileSet>

 

Шаг 7. Установите архетип в свой репозиторий.

Откройте окно командной строки в папке архетипов и введите в командной строке следующую команду:

D: \ NetBeansProjects \ javafxarchetype \ target \ generate-sources \ archetype> mvn install

Игнорируйте любые предупреждения. Архетип должен быть в безопасности

.m2 \ репозиторий \ ком \ kfcstandard \ javafxarchetype-архетип

где когда-либо ваша папка .m2.

Шаг 8а. Проверьте, работает ли он с командной строкой Maven

Создайте новую папку на вашем компьютере для теста. Я создал D: \ mvntest. Откройте командное окно в этой папке. Запустите команду:

D:\mvntest>mvn archetype:generate -DarchetypeCatalog=local

То, что следует дальше, довольно просто. Вот мой вывод. Обратите внимание, что вам нужно ввести groupId, artifactId, версию и пакет. Пакет должен быть составлен из groupId и artifactId.

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: local -> com.kfcstandard:javafxarchetype-archetype (Standard starting point for JavaFX programs for students of Ken Fogel)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 1
Define value for property 'groupId': : com.squirrel
Define value for property 'artifactId': : moose
Define value for property 'version': 1.0-SNAPSHOT: :
Define value for property 'package': com.squirrel: : com.squirrel.moose
Confirm properties configuration:
groupId: com.squirrel
artifactId: moose
version: 1.0-SNAPSHOT
package: com.squirrel.moose
 Y: : y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: javafxarchetype-archetype:0.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.squirrel
[INFO] Parameter: artifactId, Value: moose
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: com.squirrel.moose
[INFO] Parameter: packageInPathFormat, Value: com/squirrel/moose
[INFO] Parameter: package, Value: com.squirrel.moose
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: groupId, Value: com.squirrel
[INFO] Parameter: artifactId, Value: moose
[INFO] project created from Archetype in dir: D:\mvntest\moose
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.660 s
[INFO] Finished at: 2015-09-01T20:48:04-04:00
[INFO] Final Memory: 13M/243M
[INFO] ------------------------------------------------------------------------
D:\mvntest>

В проекте, который был создан в папке mvnbuild, изучите файл Scene.fxml и убедитесь, что у него есть путь к контроллеру на основе введенных вами groupId и artifactId . Проверьте pom.xml в проекте и убедитесь, что mainClass имеет правильный пакет.

Шаг 8б. Тестирование с помощью NetBeans

 Запустите NetBeans и выберите:

Файл -> Новый проект

В диалоговом окне выберите Maven слева и Project from Archetype справа и нажмите Next .

01NewProject

Прокрутите вниз, чтобы найти javafxarchetype-archetype , выберите его и нажмите Next .

02Archetype01

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

02Archetype02

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

03Running

Теперь вы готовы добавить свой код в проект.

Шаг 8c: Тестирование с Eclipse

Запустите Eclipse и затем выберите « Файл» -> «Создать» -> «Другое» . Откройте Maven в этом диалоговом окне и выберите Maven Project .

04Eclipse01

В следующем диалоговом окне ничего не изменится, поэтому просто нажмите « Далее» .

04Eclipse02

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

04Eclipse03

Теперь вы можете заполнить в группе Id , Артефакт Id , версии и пакета . Как NetBeans пакет состоит из Id группы и Артефакт Id . Нажмите на Готово .

04Eclipse04

Проект появится в проводнике пакетов . Щелкните правой кнопкой мыши проект и выберите « Выполнить как» -> «Сборка Maven», а в диалоговом окне просто выберите « Выполнить» . Программа должна открыться. Закройте его, и теперь вы готовы добавить свой код в проект.

Глоток Хныка

Изучая, как создать архетип maven, я столкнулся с серьезной проблемой, связанной с тем, что я нашел в сети. Почти каждый ответ на блог, сообщение или stackoverflow был не более чем перефразированием документации Apache Maven. Мне кажется, что эти авторы никогда не использовали Maven или Archetypes в реальных ситуациях. То же самое относится и к документации Apache Maven. В ней отсутствуют какие-либо примеры из реальной жизни, и она далеко не написана простым языком.

Существует также ошибка в системе Maven Archetype. Мне потребовалось два дня, чтобы выследить это. Если у вас есть пакет, состоящий из groupId и artifactId в папке src / main / java, и у вас точно такой же пакет в src / test / java, то архетип будет поврежден и не будет работать. Решением было поместить тесты в папку на один уровень ниже пакета. Я сообщу об этом.