Maven2: Найкраща практика для Enterprise Project (файл EAR)


100

Я просто переходжу з Мурахи на Мейвен і намагаюся розібратися з найкращою практикою для створення корпоративного проекту на основі файлів EAR?

Скажімо, я хочу створити досить стандартний проект із файлом jar для EJB, файлом WAR для веб-ярусу та інкапсулюючим EAR-файлом із відповідними дескрипторами розгортання.

Як би я пішов про це? Створіть проект, archetypeArtifactId=maven-archetype-webappяк із файлу війни, і продовжте звідти? Яка найкраща структура проекту (і приклад файлу POM) для цього? Куди ви наклеюєте дескриптори розгортання файлів вушних файлів тощо?

Дякуємо за будь-яку допомогу.

Відповіді:


96

Ви створюєте новий проект. Новий проект - це проект складання EAR, який містить дві залежності для вашого проекту EJB та вашого WAR проекту.

Тож у вас тут є три проекти Maven. Один EJB. Одна ВІЙНА. Одне СПОСОБ, яке з’єднує дві частини разом і створює вухо.

Дескриптори розгортання можуть бути згенеровані maven або розміщені всередині каталогу ресурсів у структурі проекту EAR.

Плагін Maven-ear - це те, що ви використовуєте для його налаштування, і документація хороша, але не зовсім зрозуміла, якщо ви все ще розбираєтесь, як працює maven взагалі.

Тож як приклад ви можете зробити щось подібне:

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany</groupId>
  <artifactId>myEar</artifactId>
  <packaging>ear</packaging>
  <name>My EAR</name>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <configuration>
          <version>1.4</version>
          <modules>
            <webModule>
              <groupId>com.mycompany</groupId>
              <artifactId>myWar</artifactId>
              <bundleFileName>myWarNameInTheEar.war</bundleFileName>
              <contextRoot>/myWarConext</contextRoot>
            </webModule>
            <ejbModule>
              <groupId>com.mycompany</groupId>
              <artifactId>myEjb</artifactId>
              <bundleFileName>myEjbNameInTheEar.jar</bundleFileName>
            </ejbModule>
          </modules>
          <displayName>My Ear Name displayed in the App Server</displayName>
          <!-- If I want maven to generate the application.xml, set this to true -->
          <generateApplicationXml>true</generateApplicationXml>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
    <finalName>myEarName</finalName>
  </build>

  <!-- Define the versions of your ear components here -->
  <dependencies>
    <dependency>
      <groupId>com.mycompany</groupId>
      <artifactId>myWar</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>war</type>
    </dependency>
    <dependency>
      <groupId>com.mycompany</groupId>
      <artifactId>myEjb</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>ejb</type>
    </dependency>
  </dependencies>
</project>

98
Через рік я знайшов власну відповідь, коли у мене було те саме питання. Гарна робота сама!
Майк Корнелл

1
Для мене це працювало , коли я встановив , typeякejb <type>ejb</type>
gammay

Ця помста накидає деякі попередження: 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-ear-plugin is missingі 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing, отже, ви, можливо, захочете оновити свою інакше чудову відповідь
DiegoAlfonso

46

Що мені дуже допомогло - запустити архетип Maven: генерувати мету та вибирати один із архетипів, деякі з яких, здається, регулярно оновлюються (зокрема, JBoss, здається, добре підтримується).

mvn archetype:generate

Сотні архетипів з'явилися в нумерованому списку, з якого слід вибирати (станом на 519!). Мета, яка все ще працює, спонукала мене зробити вибір, ввівши число або ввівши рядок пошуку, наприклад:

513: remote -> org.xwiki.commons:xwiki-commons-component-archetype
514: remote -> org.xwiki.rendering:xwiki-rendering-archetype-macro
515: remote -> org.zkoss:zk-archetype-component
516: remote -> org.zkoss:zk-archetype-webapp
517: remote -> ru.circumflex:circumflex-archetype (-)
518: remote -> se.vgregion.javg.maven.archetypes:javg-minimal-archetype (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains):

Я ввів пошуковий рядок "вухо", який зменшив список лише до 8 елементів (станом на сьогодні):

Choose archetype:
1: remote -> org.codehaus.mojo.archetypes:ear-j2ee14 (-)
2: remote -> org.codehaus.mojo.archetypes:ear-javaee6 (-)
3: remote -> org.codehaus.mojo.archetypes:ear-jee5 (-)
4: remote -> org.hibernate:hibernate-search-quickstart (-)
5: remote -> org.jboss.spec.archetypes:jboss-javaee6-ear-webapp 
6: remote -> org.jboss.spec.archetypes:jboss-javaee6-webapp-ear-archetype
7: remote -> org.jboss.spec.archetypes:jboss-javaee6-webapp-ear-archetype-blank
8: remote -> org.ow2.weblab.tools.maven:weblab-archetype-searcher

Я вибрав "org.jboss.spec.archetypes: jboss-javaee6-ear-webapp" (ввівши вибір у цьому прикладі "5").

Далі, мета попросила мене ввести groupId, artifactId, назви пакетів тощо, і потім вона створила наступний добре задокументований приклад програми:

[pgarner@localhost Foo]$ tree
.
|-- Foo-ear
|   `-- pom.xml
|-- Foo-ejb
|   |-- pom.xml
|   `-- src
|       |-- main
|       |   |-- java
|       |   |   `-- com
|       |   |       `-- foo
|       |   |           |-- controller
|       |   |           |   `-- MemberRegistration.java
|       |   |           |-- data
|       |   |           |   `-- MemberListProducer.java
|       |   |           |-- model
|       |   |           |   `-- Member.java
|       |   |           `-- util
|       |   |               `-- Resources.java
|       |   `-- resources
|       |       |-- import.sql
|       |       `-- META-INF
|       |           |-- beans.xml
|       |           `-- persistence.xml
|       `-- test
|           |-- java
|           |   `-- com
|           |       `-- foo
|           |           `-- test
|           |               `-- MemberRegistrationTest.java
|           `-- resources
|-- Foo-web
|   |-- pom.xml
|   `-- src
|       `-- main
|           |-- java
|           |   `-- com
|           |       `-- foo
|           |           `-- rest
|           |               |-- JaxRsActivator.java
|           |               `-- MemberResourceRESTService.java
|           `-- webapp
|               |-- index.html
|               |-- index.xhtml
|               |-- resources
|               |   |-- css
|               |   |   `-- screen.css
|               |   `-- gfx
|               |       |-- banner.png
|               |       `-- logo.png
|               `-- WEB-INF
|                   |-- beans.xml
|                   |-- faces-config.xml
|                   `-- templates
|                       `-- default.xhtml
|-- pom.xml
`-- README.md

32 directories, 23 files

Прочитавши чотири файли POM, які були добре прокоментовані, я мав майже всю необхідну мені інформацію.

./pom.xml
./Foo-ear/pom.xml
./Foo-ejb/pom.xml
./Foo-web/pom.xml

3
Це працює, але в кінцевому підсумку викладаєте у свій проект купу залежностей, пов'язаних з jboss, які ви можете або не хочете прибирати після факту.
Іен МакЛайрд

24

я створив сховище github, щоб показати, що, на мій погляд, є гарною (або найкращою практикою) структурою запуску проекту ...

https://github.com/StefanHeimberg/stackoverflow-1134894

деякі ключові слова:

  • Maven 3
  • BOM (залежність управління власними залежностями)
  • Батько для всіх проектів (Управління залежністю від зовнішніх залежностей та PluginManagement для глобальної конфігурації проекту)
  • JUnit / Mockito / DBUnit
  • Проект Clean War без WEB-INF / lib, оскільки залежності знаходяться в папці EAR / lib.
  • Проект «Чисте вухо»
  • Мінімальні дескриптори розгортання для Java EE7
  • Немає локального інтерфейсу EJB, оскільки достатньо @LocalBean.
  • Мінімальна конфігурація Maven через користувальницькі властивості Maven
  • Фактичні дескриптори розгортання для Servlet 3.1 / EJB 3.2 / JPA 2.1
  • використання плагіна macker-maven для перевірки архітектурних правил
  • Інтеграційні тести включені, але пропущені. (skipITs = false) корисно включити на сервері CI Build Server

Вихідні показники:

Reactor Summary:

MyProject - BOM .................................... SUCCESS [  0.494 s]
MyProject - Parent ................................. SUCCESS [  0.330 s]
MyProject - Common ................................. SUCCESS [  3.498 s]
MyProject - Persistence ............................ SUCCESS [  1.045 s]
MyProject - Business ............................... SUCCESS [  1.233 s]
MyProject - Web .................................... SUCCESS [  1.330 s]
MyProject - Application ............................ SUCCESS [  0.679 s]
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 8.817 s
Finished at: 2015-01-27T00:51:59+01:00
Final Memory: 24M/207M
------------------------------------------------------------------------

2
Мені дуже подобається ваша упаковка та архітектурний підхід. Вам варто подумати над упаковкою свого проекту як архетипу Maven.
Йорг

2
Дуже приємне рішення! Однак у мене є одне питання: чому б не упакувати речі BOM у батьківський проект? чому додатковий шар?
sschober

1
причина розлуки проблем. бомбу можна було імпортувати іншими проектами. їм потрібна лише залежністьУправління вашими залежностями, а не залежністьУправління залежностями, якими ви користуєтеся. гаразд. Ви можете сказати, що якщо ніхто не використовує ваш проект, то цей додатковий шар не є необхідним. Але я думаю, що це теж має сенс ... читабельність. управління залежністю батьківського проекту не змішується з вашими залежностями ... у більшому проекті з> 50 внутрішніми проектами Maven залежністьУправління всередині батьківського проекту може бути безладом ..
StefanHeimberg

2
Ще одна причина полягає в тому, що це та сама структура, що зафіксована на maven.apache.org/guides/introduction/… . це допомагає працювати в команді, де члени команди часто змінюють, оскільки це "за замовчуванням" задокументовано.
StefanHeimberg

2
До речі. Я створив проект GitHub одного разу, щоб показати, як можна зробити налаштування декількох проектів: github.com/StefanHeimberg/maven3-multiapplication-setup (для внутрішньої дискусії компанії)
StefanHeimberg

7

NetBeans IDE автоматично визначає структуру, майже схожу на структуру, запропоновану Патріком Гарнером. Для користувачів NetBeans

Файл -> Новий проект -> У лівій частині виберіть Maven і в правій частині виберіть Maven Enterprise Application і натисніть кнопку Далі -> Запитує назви проектів для війни, ejb та налаштувань.

IDE автоматично створить структуру для вас.


Я погоджуюся з вами, особливо коли дотримуюся специфікацій JEE6
Sym-Sym

3

Це хороший приклад частини модуля-вуха-плагіна .

Ви також можете перевірити архетипи Maven , які доступні як приклад. Якщо ви просто виконуватимете архетип mvn: create, ви отримаєте список доступних архетипів. Один з них є

maven-archetype-j2ee-simple

10
maven-archetype-j2ee-simpleздається зайвою складною структурою - особливо з модулями всередині модулів та окремими модулями для таких речей, як реєстрація. Я не розумів обґрунтування цієї структури
Віхунг

2

Я шукав високі і низькі приклади повного прикладу повного пакету вуха на основі додатків, і нарешті натрапив на це . Вказівки говорять, щоб вибрати варіант 2 при запуску через CLI, але для своїх цілей використовуйте варіант 1.


Посилання видає несанкціоновану помилку. І це причина для написання повних рішень замість того, щоб покладатися на посилання.
Пако Абато
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.