Maven2: лучшие практики для корпоративного проекта (файл EAR)

Я просто переключаюсь с Ant на Maven и пытаюсь понять, как лучше всего настроить проект Enterprise на основе EAR-файла?

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

Как бы я это сделал? Создавать проект с archetypeArtifactId=maven-archetype-webapp как с файлом war, и расширяться оттуда? Какая структура проекта (и пример файла POM) лучше всего подходит для этого? Куда вы вставляете дескрипторы развертывания, относящиеся к ушным файлам, и т. Д.?

Спасибо за любую помощь.


person Maik    schedule 16.07.2009    source источник


Ответы (6)


Вы создаете новый проект. Новый проект - это ваш проект сборки EAR, который содержит две ваши зависимости для вашего проекта EJB и вашего проекта WAR.

Итак, у вас на самом деле есть три проекта maven. Один EJB. Одна ВОЙНА. Одно УШИ, которое соединяет две части вместе и образует ухо.

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

Подключаемый модуль maven-ear-plugin - это то, что вы используете для его настройки, и документацию - это хорошо, но не совсем понятно, если вы все еще понимаете, как работает 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>
person Mike Cornell    schedule 16.07.2009
comment
Я нашел свой собственный ответ год спустя, когда у меня возник тот же вопрос. Хорошая работа! - person Mike Cornell; 21.07.2010
comment
Для меня это сработало, когда я установил type как ejb <type>ejb</type> - person gammay; 09.12.2013
comment
Этот pom выдает несколько предупреждений: '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, поэтому вы можете обновить свой отличный ответ - person DiegoAlfonso; 22.11.2018

Что мне очень помогло, так это запустить архетип 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
person Patrick Garner    schedule 08.01.2012
comment
Это работает, но в конечном итоге приводит к тому, что в ваш проект добавляется кучка зависимостей, специфичных для jboss, которые вы, возможно, захотите или не захотите очистить постфактум. - person Ian McLaird; 15.05.2012

Я создал репозиторий github, чтобы показать, что я считаю хорошей (или передовой практикой) структурой проекта запуска ...

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

некоторые ключевые слова:

  • Maven 3
  • Спецификация (DependencyManagement собственных зависимостей)
  • Родительский для всех проектов (DependencyManagement от внешних зависимостей и 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-plugin для проверки правил архитектуры
  • Интеграционные тесты включены, но пропущены. (skipITs = false) полезно включить на сервере сборки CI

Вывод Maven:

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
------------------------------------------------------------------------
person StefanHeimberg    schedule 26.01.2015
comment
Мне очень нравится ваша упаковка и архитектурный подход. Вам следует подумать об упаковке вашего проекта как об архетипе знатока. - person Jörg; 28.02.2015
comment
Очень красивое решение! Однако у меня есть один вопрос: почему бы не упаковать спецификацию в родительский проект? зачем дополнительный слой? - person sschober; 26.11.2015
comment
причина разделения проблем. бомба могла быть импортирована другими проектами. им нужно только dependencyManagement ваших зависимостей, а не dependencyManagement используемых вами зависимостей. в порядке. вы можете сказать, что если никто не использует ваш проект, этот дополнительный слой не нужен ... но я думаю, что это тоже имеет смысл ... читаемость. dependencyManagement родительского проекта не смешивается с вашими зависимостями ... в более крупном проекте с ›50 внутренними проектами maven управление dependencyManagement внутри родительского проекта может быть беспорядочным. - person StefanHeimberg; 26.11.2015
comment
другая причина в том, что это та же структура, что задокументирована в maven. apache.org/guides/introduction/. это помогает работать в команде, где члены команды часто меняются, потому что это задокументированный способ по умолчанию. - person StefanHeimberg; 26.11.2015
comment
КСТАТИ. Я однажды создал проект GitHub, чтобы показать, как можно выполнить настройку нескольких проектов: github.com/ StefanHeimberg / maven3-multiapplication-setup (для внутреннего обсуждения в компании) - person StefanHeimberg; 26.11.2015
comment
Отличный ответ! Я хотел бы предложить использовать Gradle вместо Maven 3 в первом маркере. Он обладает всеми преимуществами maven и, кроме того, обладает всей мощью Groovy, Java-подобного языка программирования, который можно использовать для написания очень мощных сценариев сборки. - person Farrukh Najmi; 30.12.2016

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

Файл -> Новый проект -> В левой части выберите Maven, а в правой части выберите Maven Enterprise Application и нажмите Далее -> запрашивает названия проектов для war, ejb и настроек.

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

person stackOverflow    schedule 25.04.2013
comment
Я согласен с вами, особенно при соблюдении спецификаций JEE6 - person Sym-Sym; 02.12.2013

Это хороший пример части maven-ear-plugin.

Вы также можете проверить архетипы maven, которые доступны в качестве примера. Если вы просто наберете mvn archetype: generate, вы получите список доступных архетипов. Один из них является

maven-archetype-j2ee-simple
person hcpl    schedule 22.07.2010
comment
maven-archetype-j2ee-simple кажется излишне сложным по структуре - особенно с модулями внутри модулей и отдельными модулями для таких вещей, как ведение журнала. Я не понимал смысла этой структуры - person Vihung; 16.05.2012

Я много и мало искал сквозной пример полного ушного приложения на основе maven и, наконец, наткнулся на this. В инструкциях предлагается выбрать вариант 2 при запуске через интерфейс командной строки, но для ваших целей используйте вариант 1.

person Roy Truelove    schedule 21.04.2011
comment
Ссылка выдает несанкционированную ошибку. И это причина для написания полных решений вместо того, чтобы полагаться на ссылки. - person Paco Abato; 18.08.2020