Maven2: najlepsze praktyki dotyczące projektu przedsiębiorstwa (plik EAR)

100

Właśnie przechodzę z Ant do Maven i próbuję znaleźć najlepszą praktykę, aby skonfigurować projekt Enterprise oparty na pliku EAR?

Załóżmy, że chcę utworzyć całkiem standardowy projekt z plikiem jar dla EJB, plikiem WAR dla warstwy WWW i plikiem hermetyzującym EAR z odpowiednimi deskryptorami wdrażania.

Jak bym to zrobił? Utworzyć projekt z archetypeArtifactId=maven-archetype-webappplikiem wojennym i rozszerzyć go stamtąd? Jaka jest najlepsza struktura projektu (i przykład pliku POM) do tego? Gdzie umieszczasz deskryptory wdrażania związane z plikami EAR itp.?

Dzięki za wszelką pomoc.

Maik
źródło

Odpowiedzi:

96

Tworzysz nowy projekt. Nowy projekt to projekt zespołu EAR, który zawiera dwie zależności dla projektu EJB i projektu WAR.

Tak więc masz tutaj trzy projekty maven. Jeden EJB. Jedna wojna. Jedno UCHO, które ściąga obie części razem i tworzy ucho.

Deskryptory wdrożenia mogą być generowane przez maven lub umieszczane w katalogu zasobów w strukturze projektu EAR.

Wtyczka maven-ear-plugin jest tym, czego używasz do konfiguracji, a dokumentacja jest dobra, ale nie do końca jasna, jeśli nadal wiesz, jak ogólnie działa maven.

Na przykład możesz zrobić coś takiego:

<?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>
Mike Cornell
źródło
98
Znalazłem własną odpowiedź rok później, kiedy miałem to samo pytanie. Dobra robota!
Mike Cornell
1
U mnie to zadziałało, kiedy ustawiłem typejakoejb <type>ejb</type>
gammay
Że pom rzuca pewne ostrzeżenia: 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-ear-plugin is missinga 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing, więc może chcesz zaktualizować inaczej wielką odpowiedź
DiegoAlfonso
46

Bardzo pomogło mi uruchomienie archetypu Mavena: wygeneruj cel i wybierz jeden z archetypów, z których niektóre wydają się być regularnie aktualizowane (w szczególności JBoss wydaje się być dobrze utrzymany).

mvn archetype:generate

Setki archetypów pojawiły się na ponumerowanej liście, z której można było wybrać (na razie 519!). Cel, wciąż działający, skłonił mnie do dokonania wyboru poprzez wprowadzenie liczby lub wpisanie ciągu wyszukiwania, np .:

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):

Wprowadziłem ciąg wyszukiwania „ucho”, co zmniejszyło listę do zaledwie 8 pozycji (na dzień dzisiejszy):

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

Wybrałem „org.jboss.spec.archetypes: jboss-javaee6-ear-webapp” (wpisując w tym przykładzie opcję „5”).

Następnie cel poprosił mnie o wprowadzenie groupId, artifactId, nazw pakietów itp., A następnie wygenerował następującą dobrze udokumentowaną przykładową aplikację:

[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

Po przeczytaniu czterech plików POM, które były dobrze skomentowane, miałem prawie wszystkie potrzebne informacje.

./pom.xml
./Foo-ear/pom.xml
./Foo-ejb/pom.xml
./Foo-web/pom.xml
Patrick Garner
źródło
3
To działa, ale w końcu umieszcza w projekcie kilka zależności specyficznych dla jboss, które możesz lub nie chcesz wyczyścić po fakcie.
Ian McLaird
24

stworzyłem repozytorium github, aby pokazać, co uważam za dobrą (lub najlepsze praktyki) strukturę projektu startowego ...

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

kilka słów kluczowych:

  • Maven 3
  • BOM (DependencyManagement of own dependencies)
  • Nadrzędny dla wszystkich projektów (DependencyManagement z zależności zewnętrznych i PluginManagement do globalnej konfiguracji projektu)
  • JUnit / Mockito / DBUnit
  • Projekt Clean War bez WEB-INF / lib, ponieważ zależności znajdują się w folderze EAR / lib.
  • Projekt Clean Ear.
  • Minimalne deskryptory wdrażania dla Java EE7
  • Brak lokalnego interfejsu EJB, ponieważ @LocalBean jest wystarczające.
  • Minimalna konfiguracja Mavena poprzez właściwości użytkownika Mavena
  • Rzeczywiste deskryptory wdrażania dla serwletu 3.1 / EJB 3.2 / JPA 2.1
  • użycie wtyczki macker-maven-plugin do sprawdzania reguł architektury
  • Testy integracji włączone, ale pominięte. (skipITs = false) przydatne do włączenia na serwerze budowania CI

Wyjście Mavena:

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
------------------------------------------------------------------------
StefanHeimberg
źródło
2
Bardzo podoba mi się twoje opakowanie i podejście architektoniczne. Powinieneś pomyśleć o zapakowaniu swojego projektu jako archetypu mistrza.
Jörg
2
Bardzo fajne rozwiązanie! Mam jednak jedno pytanie: dlaczego nie spakować zawartości BOM do projektu nadrzędnego? dlaczego dodatkowa warstwa?
trzeźwy
1
przyczyna rozdzielenia obaw. bombę można zaimportować do innych projektów. potrzebują one tylko zarządzania zależnościami zależnymi, a nie zarządzania zależnościami, których używasz. dobrze. można powiedzieć, że jeśli nikt nie korzysta z Twojego projektu, ta dodatkowa warstwa nie jest potrzebna… ale myślę, że to też ma sens… czytelność. zależność Zarządzanie projektem nadrzędnym nie jest pomieszane z Twoimi zależnościami ... w większym projekcie z> 50 projektami wewnętrznymi maven zależnośćManagement wewnątrz projektu nadrzędnego może być bałaganem ..
StefanHeimberg
2
Innym powodem jest to, że jest to ta sama struktura, która została udokumentowana na maven.apache.org/guides/introduction/… . pomaga to w pracy w zespole, w którym członkowie zespołu często się zmieniają, ponieważ jest to udokumentowany sposób „domyślny”.
StefanHeimberg
2
BTW. Kiedyś stworzyłem projekt GitHub, aby pokazać, jak można zrobić konfigurację wielu projektów: github.com/StefanHeimberg/maven3-multiapplication-setup (do wewnętrznej dyskusji w firmie)
StefanHeimberg
7

NetBeans IDE automatycznie definiuje strukturę, która jest prawie podobna do sugerowanej przez Patricka Garnera. Dla użytkowników NetBeans

Plik -> Nowy projekt -> Po lewej stronie wybierz Maven, a po prawej wybierz Maven Enterprise Application i naciśnij Dalej -> Pyta o nazwy projektów dla wojny, ejb i ustawień.

IDE automatycznie utworzy strukturę dla Ciebie.

przepełnienie stosu
źródło
Zgadzam się z Tobą, szczególnie jeśli chodzi o przestrzeganie specyfikacji JEE6
Sym-Sym
3

To jest dobry przykład części maven-ear-plugin .

Możesz również sprawdzić archetypy mavena, które są dostępne jako przykład. Jeśli po prostu uruchomisz archetyp mvn: wygeneruj, otrzymasz listę dostępnych archetypów. Jeden z nich jest

maven-archetype-j2ee-simple
hcpl
źródło
10
maven-archetype-j2ee-simplewydaje się niepotrzebnie skomplikowana struktura - szczególnie w przypadku modułów wewnątrz modułów i oddzielnych modułów do takich rzeczy, jak logowanie. Nie rozumiałem uzasadnienia tej struktury
Vihung
2

Szukałem od góry do dołu, aby znaleźć kompleksowy przykład kompletnej aplikacji opartej na uchu Mavena i ostatecznie się na to natknąłem . Instrukcje mówią, aby wybrać opcję 2 podczas uruchamiania przez CLI, ale do swoich celów użyj opcji 1.

Roy Truelove
źródło
Łącze zgłasza nieautoryzowany błąd. I to jest powód, dla którego piszemy kompletne rozwiązania zamiast polegać na linkach.
Paco Abato