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.

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>

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

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

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.


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

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.


Łącze zgłasza nieautoryzowany błąd. I to jest powód, dla którego piszemy kompletne rozwiązania zamiast polegać na linkach.
— Paco Abato
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.