Maven2: Лучшая практика для Enterprise Project (EAR файл)
Я просто переключаюсь с Ant на Maven и пытаюсь понять, как лучше настроить проект Enterprise на основе EAR?
Скажем, я хочу создать довольно стандартный проект с файлом jar для EJB, WAR файлом для уровня Web и инкапсулирующим EAR файлом с соответствующими дескрипторами развертывания.
Как мне это сделать? Создайте проект с помощью archetypeArtifactId=maven-archetype-webapp
как с военным файлом и откройте его? Какая лучшая структура проекта (и пример файла POM) для этого? Где вы прикрепляете дескрипторы развертывания файла, связанные с ухом, и т.д.?
Спасибо за любую помощь.
Ответы
Ответ 1
Вы создаете новый проект. Новый проект - это проект сборки EAR, который содержит две ваши зависимости для проекта EJB и проекта WAR.
Итак, у вас на самом деле есть три проекта maven. Один EJB. Одна ВОЙНА. Один EAR, который соединяет две части и создает ухо.
Дескрипторы развертывания могут быть сгенерированы 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>
Ответ 2
Что мне очень помогло, чтобы запустить архетип 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, пакетов и т.д., а затем сгенерировало следующее хорошо документированное примерное приложение:
[[email protected] 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
Я сделал репозиторий github, чтобы показать, что я считаю хорошей (или лучшей практикой) структуру проекта запуска...
https://github.com/StefanHeimberg/stackoverflow-1134894
несколько ключевых слов:
- Maven 3
- BOM (DependencyManagement собственных зависимостей)
- Родитель для всех проектов (DependencyManagement из внешних зависимостей и PluginManagement для глобальной конфигурации проекта)
- JUnit/Mockito/DBUnit
- Проект Clean War без WEB-INF/lib, потому что зависимости находятся в папке EAR/lib.
- Проект Clean Ear.
- Минимальные дескрипторы развертывания для 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
------------------------------------------------------------------------
Ответ 4
Средство IDE NetBeans автоматически определяет структуру, которая почти аналогична структуре, предложенной Патриком Гарнером. Для пользователей NetBeans
Файл → Новый проект → В левой части выберите Maven, а в правой части выберите Maven Enterprise Application. > и нажмите Далее → запрашивает имена проектов для обеих версий war, ejb и настроек.
IDE автоматически создаст структуру для вас.
Ответ 5
Я искал высоко и низко для сквозного примера полного приложения на ушах на основе maven и, наконец, наткнулся на this. Инструкции говорят, чтобы выбрать вариант 2 при запуске через CLI, но для ваших целей используйте опцию 1.
Ответ 6
Это хороший пример части maven-ear-plugin.
Вы также можете проверить maven archetypes, которые доступны в качестве примера. Если вы просто запустили mvn archetype: generate, вы получите список доступных архетипов. Один из них -
maven-archetype-j2ee-simple