Maven2: best practice voor Enterprise Project (EAR-bestand)

Ik stap net over van Ant naar Maven en probeer de beste werkwijze te vinden om een ​​EAR-bestandsgebaseerd Enterprise-project op te zetten?

Stel dat ik een vrij standaardproject wil maken met een jar-bestand voor de EJB’s, een WAR-bestand voor de weblaag en het encapsulerende EAR-bestand, met de bijbehorende implementatiedescriptors.

Hoe zou ik het aanpakken? Het project maken met archetypeArtifactId=maven-archetype-webappzoals bij een war-bestand, en van daaruit uitbreiden? Wat is hiervoor de beste projectstructuur (en POM-bestandsvoorbeeld)? Waar plak je de oorbestand-gerelateerde implementatiedescriptors, enz.?

Bedankt voor alle hulp.


Antwoord 1, autoriteit 100%

U maakt een nieuw project aan. Het nieuwe project is je EAR-assemblageproject dat je twee afhankelijkheden voor je EJB-project en je WAR-project bevat.

Dus je hebt hier eigenlijk drie maven-projecten. Een EJB. Een OORLOG. Eén EAR dat de twee delen bij elkaar brengt en het oor vormt.

Descriptors voor implementatie kunnen worden gegenereerd door maven of in de bronnenmap in de EAR-projectstructuur worden geplaatst.

De maven-ear-plugin is wat je gebruikt om het te configureren, en de documentatieis goed, maar niet helemaal duidelijk of je nog steeds aan het uitzoeken bent hoe maven in het algemeen werkt.

Dus als voorbeeld zou je zoiets als dit kunnen doen:

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

Antwoord 2, Autoriteit 46%

Wat heeft me veel geholpen om het Maven Archetype te runnen: het genereren van doel en selecteer uit een van de archetypen, waarvan sommige regelmatig lijken te worden bijgewerkt (met name Jboss lijkt goed onderhouden te zijn).

mvn archetype:generate

Honderden archetypen verschenen in een genummerde lijst om te selecteren (519 vanaf nu!). Het doel, nog steeds actief, heeft me gevraagd om een ​​selectie te maken door een nummer in te voeren of een zoekreeks te invoeren, b.v.:

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

Ik heb het zoekreeks “EAR” ingevoerd, wat de lijst met slechts 8 items (vanaf vandaag) heeft gereduceerd:

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

Ik heb “org.jboss.spec.archetypes: JBoss-Javae6-Ear-WebApp” geselecteerd (door de selectie “5” in dit voorbeeld in te voeren).

Vervolgens vroeg het doel mij om de groepstoevoerige, artifactid, pakketnamen, enz., En deze gegenereerde vervolgens de volgende goed gedocumenteerde voorbeeldtoepassing op:

[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

Na het lezen van de vier POM-bestanden, die goed becommentarieerd waren, had ik vrijwel alle informatie die ik nodig had.

./pom.xml
./Foo-ear/pom.xml
./Foo-ejb/pom.xml
./Foo-web/pom.xml

Antwoord 3, autoriteit 24%

ik heb een github-repository gemaakt om te laten zien wat volgens mij een goede (of best practices) opstartprojectstructuur is…

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

enkele zoekwoorden:

  • Maven 3
  • BOM (Afhankelijkheidsbeheer van eigen afhankelijkheden)
  • Ouder voor alle projecten (DependencyManagement van externe afhankelijkheden en PluginManagement voor globale projectconfiguratie)
  • JUnit / Mockito / DBUnit
  • Clean War-project zonder WEB-INF/lib omdat de afhankelijkheden in de EAR/lib-map staan.
  • Clean Ear-project.
  • Minimale implementatiedescriptors voor Java EE7
  • Geen lokale EJB-interface omdat @LocalBean voldoende is.
  • Minimale maven-configuratie via maven-gebruikerseigenschappen
  • Werkelijke implementatiedescriptors voor Servlet 3.1 / EJB 3.2 / JPA 2.1
  • gebruik van macker-maven-plugin om architectuurregels te controleren
  • Integratietests ingeschakeld, maar overgeslagen. (skipITs=false) handig om in te schakelen op CI Build Server

Maven-uitvoer:

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

Antwoord 4, autoriteit 7%

NetBeans IDE definieert automatisch de structuur die bijna gelijk is aan die voorgesteld door Patrick Garner. Voor NetBeans-gebruikers

Bestand->Nieuw project->Selecteer aan de linkerkant Mavenen selecteer aan de rechterkant Maven Enterprise Applicationen druk op Volgende-> Vraagt ​​om projectnamen voor zowel war,ejb als instellingen.

De IDE zal automatisch de structuur voor u maken.


Antwoord 5, autoriteit 3%

Dit is een goed voorbeeld van het maven-ear-plugingedeelte.

Je kunt ook de maven archetypesbekijken die beschikbaar zijn als een voorbeeld. Als je mvn archetype:generate gewoon uitvoert, krijg je een lijst met beschikbare archetypen. Een daarvan is

maven-archetype-j2ee-simple

Antwoord 6, autoriteit 2%

Ik heb hoog en laag gezocht naar een end-to-end voorbeeld van een complete op maven gebaseerde oorverpakte applicatie en kwam uiteindelijk dit. In de instructies staat dat u optie 2 moet selecteren wanneer u door de CLI loopt, maar voor uw doeleinden, gebruik optie 1.

Other episodes