Статьи

NetBeans в классе: вы должны использовать Maven в классе (часть 3)


колледже Доусон в Монреале, Канада. Он также является программным консультантом и по совместительству преподавателем в Школе расширенного обучения при Институте вычислительной техники Университета Конкордия . Он ведет блог на omniprogrammer.com и пишет в Твиттере @omniprof . Его регулярные колонки о NetBeans в образовании перечислены здесь .

… и на работе!

В продолжение второй части этой следующей статьи о Maven в классе мы продолжим рассмотрение файла pom.xml, который был создан NetBeans при выборе приложения Maven JavaFX. В прошлой статье мы увидели, что проект был организован в папки по Maven, а не по NetBeans. Образцы пакетов и файлов были созданы. Откуда они пришли?

Maven проекты могут быть определены шаблонами. Они называются архетипами. Эти шаблоны могут определять файл pom, структуру каталогов и примеры файлов. Вы можете получить доступ к архетипам, включенным в NetBeans, выбрав Новый проект | Maven | Проект от Архетипа.

Существует множество архетипов, включенных в NetBeans. Я просто хочу взглянуть на те из них для JavaFX, поэтому я использовал поле поиска и ввел JavaFX.

Выделенный архетип на изображении — «javafx». Именно этот архетип используется NetBeans при создании приложения JavaFX Maven. Я надеюсь узнать, как создавать архетипы, чтобы у моих учеников был модифицированный пом, который я представлю в следующей статье как часть пользовательского архетипа.

Вернуться к pom.xml

В pom-файле следующий раздел принадлежит тегу build. Сборка — это то, где плагины объявлены. Плагины — это модули, которые могут быть вызваны для выполнения определенного действия во время сборки проекта. В разделе сборки pom определены четыре плагина, и они вложены в тег плагина. Первый — это плагин зависимости.

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <version>2.6</version>
         <executions>
            <execution>
               <id>unpack-dependencies</id>
               <phase>package</phase>
               <goals>
                  <goal>unpack-dependencies</goal>
               </goals>
               <configuration>
                  <excludeScope>system</excludeScope>
                  <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
               </configuration>
            </execution>
         </executions>
      </plugin>

Зависимости — это библиотечные файлы, которые необходимы для компиляции, выполнения и упаковки проекта. Плагин maven-dependency-plugin управляет этими зависимостями. Что интересно в присутствии этого плагина, так это то, что в этом pom не определены зависимости. Похоже, что здесь, на всякий случай.

Этот плагин используется для помещения необходимых файлов зависимостей в папку с именем classes. Эти файлы будут поступать из локального хранилища. Позже в pom, когда проект упакован, все эти файлы будут частью JAR, который создает сборка. Это действие произойдет на этапе сборки пакета при создании файла JAR. Я объясню фазы в следующей статье.

Есть два тега исключения. Первый, excludeScope, предотвращает добавление системных файлов Java в проект. Следующее исключение, excludeGroupIds, перечисляет три идентификатора известных библиотек, используемых для модульного тестирования приложения. Они не должны быть включены в исполняемый JAR, который будет создан, поэтому они перечислены здесь.

Последний пункт, который нужно указать. Переменная $ {project.build.directory} определяется Maven. Существует ряд этих переменных, которые определяет Maven, и значения NetBeans, а также другие среды IDE.

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>exec-maven-plugin</artifactId>
   <version>1.2.1</version>
   <executions>

Плагин exec-maven-plugin отвечает за выполнение программ во время сборки, обычно за выполнение самого проекта. Этот плагин выполняет две программы.

   <execution>
    <id>unpack-dependencies</id>
    <phase>package</phase>
    <goals>
        <goal>exec</goal>
    </goals>
    <configuration>
        <executable>${java.home}/../bin/javafxpackager</executable>
        <arguments>
            <argument>-createjar</argument>
            <argument>-nocss2bin</argument>
            <argument>-appclass</argument>
            <argument>${mainClass}</argument>
            <argument>-srcdir</argument>
            <argument>${project.build.directory}/classes</argument>
            <argument>-outdir</argument>
            <argument>${project.build.directory}</argument>
            <argument>-outfile</argument>
            <argument>${project.build.finalName}.jar</argument>
        </arguments>
    </configuration>
   </execution>

Этот первый раздел выполнения использует внешнюю программу javafxpackager для создания исполняемого файла JAR. До Java 8 это был необходимый инструмент для такой задачи. Аргументы используют переменные Maven для информирования инструмента, где он может найти нужные ему файлы и информацию, необходимую для создания JAR. Аргумент –noocss2bin указывает, что таблицы стилей CSS не будут храниться в JAR как двоичные файлы. Они останутся в виде текстовых файлов. Теперь вы можете понять, почему плагин зависимостей поместил все зависимости в папку классов. Это где javafxpackager найдет затем включить в банку.

         <execution>
            <id>default-cli</id>
            <goals>
                <goal>exec</goal>                            
            </goals>
            <configuration>
                <executable>${java.home}/bin/java</executable>
                <commandlineArgs>${runfx.args}</commandlineArgs>
            </configuration>
        </execution>
    </executions>  
</plugin>

Второй раздел выполнения отвечает за запуск проекта. Он делает это так, как будто он запускается из командной строки. Это приведет к тому, что в системе будет запущен новый экземпляр JVM, а затем будет запущен JAR. CommandLineArgs $ {runfx.args} не является переменной Maven. Он определяется NetBeans и, к сожалению, делает этот pom-файл непереносимым и, следовательно, непригодным для использования в других IDE.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.7</source>
        <target>1.7</target>
        <compilerArguments>                           
            <bootclasspath>
                ${sun.boot.class.path}${path.separator}${java.home}/lib/jfxrt.jar
            </bootclasspath>
        </compilerArguments>
    </configuration>
</plugin>

Плагин maven-compiler-plugin позволяет вам определить, какую версию Java использовать для компилятора (источник) и с какой JVM должны быть совместимы файлы классов (цель). В Java 7 библиотека JavaFX, jfxrt.jar, не была частью стандартного пути к классам. Загрузочный путь добавляет библиотеку к пути, чтобы компилятор имел к ней доступ.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <additionalClasspathElements>                          
            <additionalClasspathElement>
                ${java.home}/lib/jfxrt.jar
            </additionalClasspathElement>
        </additionalClasspathElements>
    </configuration>
</plugin>

Maven-surefire-plugin отвечает за выполнение модульных тестов. Чтобы это работало, должна быть зависимость от библиотеки JUnit, которой нет в этом файле pom. JUnit сообщает об успехах и неудачах модульных тестов. Этот плагин запишет результаты в текстовый и XML-файл. Если вам нужен дополнительный pizazz, есть дополнительный плагин, который может выводить результаты в HTML.

Теперь у вас есть представление о том, что делает этот файл pom и как он это делает. В моей следующей статье я представлю файл pom для замены, который можно использовать только с Java 8, но переносим на другие IDE. Плюс, у него будут зависимости!