Статьи

Java EE7 и Maven проект для новичков — часть 1 — простая структура проекта Maven — родительский pom

Зачем ?

Много раз я пытался решить несколько основных или сложных проблем со структурой проекта Maven / Java EE в своей повседневной работе. Чтобы предоставить решения, я часто в конечном итоге экспериментирую со структурой проекта, тестирую свое развертывание на разных серверах приложений и детализирую свою конфигурацию.

У Maven может быть крутая кривая обучения для новичков, и если вы добавите в сочетание « иногда » сложные требования к конфигурации современного приложения Java EE , все станет еще сложнее. Я также видел в своей карьере, что многие начинающие Java-разработчики , когда они присоединяются к большой команде или проекту, в большинстве случаев структура проекта уже детально проработана и настроена для них более старшими членами. Они предполагают, что это работает, и они не потратили время, чтобы понять проводку и конфигурацию. Я сделал эту ошибку сам в прошлом. Им поручают простые задачи кодирования, и они глубоко погружаются в требования, но, к сожалению, они забывают изучить структуру приложения. Их старшие коллеги также забывают обучать их в этой конкретной области, в большинстве случаев из-за временных ограничений. Это может привести к несчастным случаям, когда люди начинают бездельничать со структурой приложения без предыдущего опыта, пытаясь « заставить его работать» . Maven и его соглашения нацелены на то, чтобы помочь в создании общих структур и соглашений о том, как проект должен быть структурирован, но опять же вам нужно понять инструмент соглашения и затем освоить вашу « конфигурацию ».

Часто можно услышать, как кто-то говорит: « Я добавил эту библиотеку туда, и она сработала », если вы ответите « определите там », то вы можете получить некоторые интересные ответы. Иногда по случайности или по счастливой случайности это работает, но в сложном многомодульном приложении, в большинстве случаев « это просто работает », является преуменьшением, и проблемы начнут появляться достаточно скоро.

Эта серия публикаций в основном предназначена для новичков в Maven и Java EE , но вы можете поделиться ими или использовать их в качестве демонстрационной версии, если вы являетесь более опытным разработчиком. Я собираюсь «атаковать» на демонстрационной основе некоторые реальные проблемы, с которыми я сталкиваюсь, обнаруживая изо дня в день работу, и пытаюсь найти решения, предоставляя базовое объяснение или ссылки на соответствующие ресурсы. Пожалуйста, не стесняйтесь добавлять комментарии, исправления или ссылки для чего-то, что может быть выполнено / завершено намного чище. Лучший способ изучить Maven и создать «сложное», но простое в обслуживании приложение — это начать с нуля, пустые файлы pom.

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

Основные технологии, которые будут использоваться

  • Приложение на основе Java EE 7
  • Будет упакован как EAR
  • Будут представлены несколько компонентов (войны, банки, ejb банки)
  • Будет скомпилировано в сторону Java 7
  • Будет упакован с использованием Maven 3

Мое приложение для демонстрации ушей

Мое приложение должно быть EAR , для этого конкретного поста это ухо будет включать 2 модуля верхнего уровня — войну и ejb-jar. Также будет фляга, которая будет содержать классы, которые будут моей моделью домена базы данных (сущности JPA). Я собираюсь расширить структуру, добавив больше ресурсов в будущих постах. Очень абстрактный образ, просто чтобы дать идею, иллюстрирующую то, что собирается «включить в наше ухо». Военный модуль в будущем будет содержать сервлеты или JSF-компоненты, а сервисный модуль будет содержать набор общих компонентов Sesson Beans без состояния (или компонентов, управляемых сообщениями). Доменный проект будет иметь простые Java-классы, должным образом аннотированные конструкциями JPA 2.

CapturFiles_1

Составление базовой структуры нашего приложения с использованием Maven

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

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

Я предполагаю, что вы рассмотрели некоторые основные вещи из Maven, и вы, по крайней мере, знакомы с терминологией. Если нет, посмотрите здесь .

Помните, что Maven — это размещение ваших файлов в нужных местах в соответствии с четко определенной структурой и определение плагинов maven, которые представляют собой инструменты для компиляции, упаковки, копирования файлов и т. Д. Плагины вызываются Maven, так что да, вам снова нужно определить плагины в правильном месте и с соответствующей конфигурацией. Вы не пишете свои скрипты make или ant, вы просто «вставляете» плагины и просите maven выполнить их в четко определенном порядке.

Как мой хороший бывший коллега (недавно написал в электронном письме), хорошо нарушать соглашения в вашей жизни и в вашем кодировании, но никогда с Maven . Он прав!

Если вы не уверены, как установить Maven, посмотрите здесь Windows или Mac

Структура моего проекта Maven — Аннотация

Мы строим с Maven, поэтому мы должны думать о терминах и модулях maven. Для того, чтобы создать необходимую упаковку для ушей (см. Выше), нам нужно 5 poms

  • Пом — действующий как родитель
  • Пом, который будет содержать / определять последнее ухо — отвечает за настройку окончательного пакета.
  • Пом, который будет содержать / определять код веб-приложения, то есть наш .war
  • Пом, который будет содержать / определять код ejb-модуля, модуля, в который мы собираемся упаковать наши EJB-компоненты
  • Пом, который будет содержать классы, которые будут нашими JPA (объектами базы данных)

CapturFiles_4
Как видите, у каждого модуля есть свой pom, и есть родитель, одна из вещей, которую многие люди не добавляют в свою структуру, предполагая, что им это не нужно, так как их проект небольшой, и через некоторое время, когда добавляются другие модули, вы в конечном итоге получите хаос. Так что запишите здесь: «Родительский pom действительно хорошо иметь и настраивать ». Это pom, в котором вы определяете все свои версии зависимостей (то есть библиотеки) и настраиваете подключаемые модули maven, чтобы все дочерние poms наследовали общую конфигурацию.

Структура моего проекта Maven — родительский помп

Как я уже говорил, мы начнем с нуля, поэтому я создаю новую папку с именем sample-parent и в эту папку добавляю новый файл pom.xml .

01
02
03
04
05
06
07
08
09
10
        <modelVersion>4.0.0</modelVersion>
        <groupId>gr.javapapo</groupId>
        <artifactId>sample-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
  
        
</project>

Да, не взволнован, просто запишите элемент упаковки, который определяет « pom ». Родитель называется parent, потому что он «определяет» и управляет дочерними модулями, это делается в разделе определения модулей. Наш оригинальный пом становится чем-то вроде этого. Это означает, что мы должны создать соответствующие папки под нашим образцом-родителем , а затем добавить pom.xml к каждой из них.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
        <modelVersion>4.0.0</modelVersion>
        <groupId>gr.javapapo</groupId>
        <artifactId>sample-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
  
        <modules>
                <module>sample-ear</module>
                <module>sample-web</module>
                <module>sample-services</module>
                <module>sample-domain</module>
        </modules>
        
</project>

Давайте продолжим добавлять еще несколько настроек …

Это важный раздел, так как мы определяем версии для

  • плагины Maven мы будем использовать и настраивать
  • любые библиотеки — используемые зависимости и ссылки из других модулей
  • другие общие свойства, такие как версия среды выполнения Java, которую мы собираемся скомпилировать
  • Кодировка по умолчанию для исходных файлов или других ресурсов.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<properties>
        <!--  encoding-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--java version -->
        <java-version>1.7</java-version>
        
        <!-- plugin versions -->
        <ejb-plugin-version>2.3</ejb-plugin-version>
        <war-plugin-version>2.4</war-plugin-version>
        <ear-plugin-version>2.9</ear-plugin-version>
        <compiler-plugin-version>3.1</compiler-plugin-version>
  
        <!-- dependency versions -->
        <javaee-api-version>7.0</javaee-api-version>
                
        <!-- EJB spec version -->
        <ejb-spec-version>3.2</ejb-spec-version>
</properties>

Давайте добавим после раздела свойств еще один важный элемент dependencyManagement. Здесь мы определим зависимости и их версии, которые могут потенциально использоваться в наших модулях приложения. В этом разделе мы на самом деле заботимся о версии, включении или исключении зависимостей от дочернего pom (то есть они не добавляются автоматически), а также об их сфере действия. Таким образом, раздел DependencyManagement предназначен для управления версиями в одном центральном месте.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<dependencyManagement>
        <dependencies>
                <dependency>
                        <groupId>javax</groupId>
                        <artifactId>javaee-api</artifactId>
                        <version>${javaee-api-version}</version>
                </dependency>
                <dependency>
                        <groupId>junit</groupId>
                        <artifactId>junit</artifactId>
                        <version>${junit-version}</version>
                </dependency>
        </dependencies>
</dependencyManagement>

Еще один последний, но важный раздел в нашем родительском pom, похожий на dependencyManagemt, называется pluginManagement и представляет собой раздел, в котором мы определим версии и общую конфигурацию всех подключаемых модулей maven, на которые будут ссылаться и которые будут использоваться во время конфигурации и упаковки нашего приложения. В приведенном ниже примере я определил один из самых основных, плагин компилятора, но, конечно, мне нужно больше!

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<!-- Plugin management -->
<build>
  <pluginManagement>
     <plugins>
        <!-- compiler plugin -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${compiler-plugin-version}</version>
          <configuration>
            <source>${java-version}</source>
            <target>${java-version}</target>
            <encoding>${project.build.sourceEncoding}</encoding>
         </configuration>
      </plugin>
   </plugins>
  </pluginManagement>
</build>

Давайте добавим и настроим еще несколько плагинов, которые мы будем использовать позже. Добавьте их в раздел управления плагинов. Мы определяем плагин ejb, который собирается скомпилировать и упаковать наши ejb (s) и плагин war, который собирается упаковать нашу войну.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!-- ejb plugin -->
<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ejb-plugin</artifactId>
        <version>${ejb-plugin-version}</version>
        <configuration>
                <ejbVersion>${ejb-spec-version}</ejbVersion>
        </configuration>
</plugin>
  
<!-- war plugin -skinny wars mode! -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>${war-plugin-version}</version>
  <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
        <archive>
                <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                </manifest>
        </archive>
        <webResources>
                <resource>
                        <filtering>true</filtering>
                        <directory>src/main/webapp</directory>
                        <includes>
                                <include>**/web.xml</include>
                        </includes>
                </resource>
        </webResources>
  </configuration>
</plugin>

Это сейчас

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

Очки для изучения

  • стандартная компоновка maven
  • родительский пом
  • важность зависимостиManagement & PluginManagement

Ресурсы