Maven2: Best Practice für Enterprise Project (EAR-Datei)

100

Ich wechsle gerade von Ant zu Maven und versuche, die beste Vorgehensweise zum Einrichten eines auf EAR-Dateien basierenden Enterprise-Projekts herauszufinden.

Angenommen, ich möchte ein hübsches Standardprojekt mit einer JAR-Datei für die EJBs, einer WAR-Datei für die Webschicht und der Kapselungs-EAR-Datei mit den entsprechenden Bereitstellungsdeskriptoren erstellen.

Wie würde ich vorgehen? Erstellen Sie das Projekt mit archetypeArtifactId=maven-archetype-webappwie mit einer Kriegsdatei und erweitern Sie von dort aus? Was ist die beste Projektstruktur (und das beste Beispiel für eine POM-Datei) dafür? Wo kleben Sie die Bereitstellungsdeskriptoren usw. für Ohrdateien?

Vielen Dank für jede Hilfe.

Maik
quelle

Antworten:

95

Sie erstellen ein neues Projekt. Das neue Projekt ist Ihr EAR-Assembly-Projekt, das Ihre beiden Abhängigkeiten für Ihr EJB-Projekt und Ihr WAR-Projekt enthält.

Sie haben hier also tatsächlich drei Maven-Projekte. Ein EJB. Ein Krieg. Ein OHR, das die beiden Teile zusammenzieht und das Ohr schafft.

Bereitstellungsdeskriptoren können von maven generiert oder im Ressourcenverzeichnis in der EAR-Projektstruktur abgelegt werden.

Das Maven-Ear-Plugin wird zum Konfigurieren verwendet, und die Dokumentation ist gut, aber nicht ganz klar, wenn Sie noch herausfinden, wie Maven im Allgemeinen funktioniert.

Als Beispiel könnten Sie so etwas tun:

<?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
quelle
98
Ein Jahr später fand ich meine eigene Antwort, als ich die gleiche Frage hatte. Gute Arbeit selbst!
Mike Cornell
1
Für mich hat das funktioniert, als ich typealsejb <type>ejb</type>
gammay
Dieser Pom wirft einige Warnungen aus: 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-ear-plugin is missingund 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missingdeshalb möchten Sie vielleicht Ihre ansonsten großartige Antwort aktualisieren
DiegoAlfonso
46

Was mir sehr geholfen hat, war die Ausführung des Maven-Archetyps: Ziel generieren und aus einem der Archetypen auswählen, von denen einige regelmäßig aktualisiert zu werden scheinen (insbesondere JBoss scheint gut gepflegt zu sein).

mvn archetype:generate

Hunderte von Archetypen erschienen in einer nummerierten Liste, aus der ausgewählt werden konnte (ab sofort 519!). Das noch laufende Ziel veranlasste mich, eine Auswahl zu treffen, indem ich eine Nummer oder eine Suchzeichenfolge eingab, z.

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

Ich habe die Suchzeichenfolge "ear" eingegeben, wodurch die Liste auf nur 8 Elemente reduziert wurde (Stand heute):

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

Ich habe "org.jboss.spec.archetypes: jboss-javaee6-ear-webapp" ausgewählt (indem ich in diesem Beispiel die Auswahl "5" eingegeben habe).

Als nächstes forderte mich das Ziel auf, die Gruppen-ID, die Artefakt-ID, die Paketnamen usw. einzugeben, und es wurde die folgende gut dokumentierte Beispielanwendung generiert:

[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

Nachdem ich die vier gut kommentierten POM-Dateien gelesen hatte, hatte ich so ziemlich alle Informationen, die ich brauchte.

./pom.xml
./Foo-ear/pom.xml
./Foo-ejb/pom.xml
./Foo-web/pom.xml
Patrick Garner
quelle
3
Dies funktioniert, führt jedoch dazu, dass Ihr Projekt eine Reihe von jboss-spezifischen Abhängigkeiten enthält, die Sie möglicherweise nachträglich bereinigen möchten oder nicht.
Ian McLaird
24

Ich habe ein Github-Repository erstellt, um zu zeigen, was meiner Meinung nach eine gute (oder bewährte) Startup-Projektstruktur ist ...

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

einige Schlüsselwörter:

  • Maven 3
  • Stückliste (DependencyManagement eigener Abhängigkeiten)
  • Übergeordnet für alle Projekte (DependencyManagement von externen Abhängigkeiten und PluginManagement für die globale Projektkonfiguration)
  • JUnit / Mockito / DBUnit
  • Clean War-Projekt ohne WEB-INF / lib, da sich die Abhängigkeiten im Ordner EAR / lib befinden.
  • Clean Ear-Projekt.
  • Minimale Bereitstellungsdeskriptoren für Java EE7
  • Keine lokale EJB-Schnittstelle, da @LocalBean ausreicht.
  • Minimale Maven-Konfiguration durch Maven-Benutzereigenschaften
  • Deskriptoren für die tatsächliche Bereitstellung für Servlet 3.1 / EJB 3.2 / JPA 2.1
  • Verwendung des Macker-Maven-Plugins zur Überprüfung der Architekturregeln
  • Integrationstests aktiviert, aber übersprungen. (skipITs = false) nützlich zum Aktivieren auf CI Build Server

Maven-Ausgabe:

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
quelle
2
Ich mag Ihren Verpackungs- und Architekturansatz sehr. Sie sollten darüber nachdenken, Ihr Projekt als Maven-Archetyp zu verpacken.
Jörg
2
Sehr schöne Lösung! Ich habe jedoch eine Frage: Warum nicht das Stücklistenmaterial in das übergeordnete Projekt packen? warum die zusätzliche Schicht?
Oktober
1
Ursache für die Trennung von Bedenken. Die Bom könnte von anderen Projekten importiert werden. Sie benötigen nur das DependencyManagement Ihrer Abhängigkeiten und nicht das DependencyManagement der von Ihnen verwendeten Abhängigkeiten. OK. Sie können sagen, dass, wenn niemand Ihr Projekt verwendet, diese zusätzliche Ebene nicht notwendig ist. Aber ich denke, dass es auch Sinn macht. Lesbarkeit. Das DependencyManagement des übergeordneten Projekts wird nicht mit Ihren Abhängigkeiten gemischt. In einem größeren Projekt mit> 50 internen Maven-Projekten kann das DependencyManagement im übergeordneten Projekt ein Chaos sein.
StefanHeimberg
2
Ein weiterer Grund ist, dass dies dieselbe Struktur ist wie unter maven.apache.org/guides/introduction/… dokumentiert . Dies hilft bei der Arbeit in einem Team, in dem sich die Teammitglieder häufig ändern, da dies die "standardmäßige" dokumentierte Methode ist.
StefanHeimberg
2
Übrigens. Ich habe einmal ein GitHub-Projekt erstellt, um zu zeigen, wie ein Multi-Projekt-Setup durchgeführt werden kann: github.com/StefanHeimberg/maven3-multiapplication-setup (für eine unternehmensinterne Diskussion)
StefanHeimberg
7

NetBeans IDE definiert automatisch die Struktur, die der von Patrick Garner vorgeschlagenen Struktur fast ähnlich ist. Für NetBeans-Benutzer

Datei -> Neues Projekt -> Wählen Sie auf der linken Seite Maven und auf der rechten Seite Maven Enterprise Application und klicken Sie auf Weiter -> Fragt nach Projektnamen für Krieg, EJB und Einstellungen.

Die IDE erstellt automatisch die Struktur für Sie.

Paketüberfluss
quelle
Ich stimme Ihnen zu, insbesondere wenn Sie die JEE6-Spezifikationen einhalten
Sym-Sym
3

Dies ist ein gutes Beispiel für den Maven-Ear-Plugin- Teil.

Sie können auch die Maven-Archetypen überprüfen, die als Beispiel verfügbar sind. Wenn Sie nur mvn archetype: generate ausführen, erhalten Sie eine Liste der verfügbaren Archetypen. Einer von ihnen ist

maven-archetype-j2ee-simple
hcpl
quelle
10
maven-archetype-j2ee-simplescheint in der Struktur unnötig komplex zu sein - insbesondere bei Modulen innerhalb von Modulen und separaten Modulen für Dinge wie die Protokollierung. Ich habe die
Gründe
3

Ich habe für ein End-to-End - Beispiel einer vollständigen Maven-basiertes Ohr verpackt Anwendung hohe und niedriger gesucht und schließlich gestolpert diese . In den Anweisungen wird angegeben, dass beim Ausführen der CLI Option 2 ausgewählt werden soll. Verwenden Sie jedoch für Ihre Zwecke Option 1.

Roy Truelove
quelle