Maven2: Enterprise Project için en iyi uygulama (EAR dosyası)


100

Sadece Ant'tan Maven'e geçiyorum ve EAR dosyası tabanlı bir Kurumsal proje oluşturmak için en iyi uygulamayı bulmaya mı çalışıyorum?

Diyelim ki, EJB'ler için bir jar dosyası, Web katmanı için bir WAR dosyası ve ilgili dağıtım tanımlayıcıları ile kapsülleyen EAR dosyası içeren oldukça standart bir proje oluşturmak istiyorum.

Bunu nasıl yapacağım? Projeyi archetypeArtifactId=maven-archetype-webappbir savaş dosyasıyla oluşturup oradan uzatmak mı? Bunun için en iyi proje yapısı (ve POM dosyası örneği) nedir? Kulak dosyasıyla ilgili dağıtım tanımlayıcılarını vb. Nereye yapıştırırsınız?

Herhangi bir yardım için teşekkürler.

Yanıtlar:


96

Yeni bir proje yaratırsınız. Yeni proje, EJB projeniz ve WAR projeniz için iki bağımlılığınızı içeren EAR montaj projenizdir.

Yani aslında burada üç maven projeniz var. Bir EJB. Bir SAVAŞ. İki parçayı bir araya getiren ve kulağı oluşturan bir KULAK.

Dağıtım tanımlayıcıları maven tarafından oluşturulabilir veya EAR proje yapısındaki kaynaklar dizininin içine yerleştirilebilir.

Maven-ear-eklentisi, onu yapılandırmak için kullandığınız şeydir ve dokümantasyon iyidir, ancak genel olarak maven'in nasıl çalıştığını hala çözüyorsanız, tam olarak net değildir.

Örnek olarak şöyle bir şey yapabilirsiniz:

<?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
Bir yıl sonra aynı soruyu sorduğumda kendi cevabımı buldum. İyi iş ben!
Mike Cornell

1
Ben ayarladığınızda Benim için bu çalıştı typeolarakejb <type>ejb</type>
gammay

O pom bazı uyarılar veriyor : 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-ear-plugin is missingve 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missingbaşka türlü harika cevabınızı güncellemek isteyebilirsiniz
DiegoAlfonso

46

Bana çok yardımcı olan şey Maven arketipini çalıştırmaktı: hedef oluşturmak ve arketiplerden birini seçmek, bazıları düzenli olarak güncelleniyor gibi görünüyor (özellikle JBoss iyi durumda görünüyor).

mvn archetype:generate

Aralarından seçim yapabileceğiniz numaralandırılmış listede yüzlerce arketip belirdi (şu an itibariyle 519!). Hala devam eden hedef, bir numara girerek veya bir arama dizesi girerek bir seçim yapmamı istedi, örneğin:

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

Listeyi yalnızca 8 öğeye indiren (bugün itibariyle) "kulak" arama dizesini girdim:

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" ı seçtim (bu örnekte "5" seçimini girerek).

Daha sonra hedef benden groupId, artifactId, paket adları vb. Girmemi istedi ve ardından aşağıdaki iyi belgelenmiş örnek uygulamayı oluşturdu:

[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

İyi yorumlanmış dört POM dosyasını okuduktan sonra, ihtiyacım olan hemen hemen tüm bilgilere sahip oldum.

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

3
Bu işe yarıyor, ancak sonunda projenize bir dizi jboss'a özgü bağımlılık ekliyor, ki bu durumdan sonra temizlemek isteyip istemediğinizi.
Ian McLaird

24

İyi (veya en iyi uygulamalar) bir başlangıç ​​proje yapısı olduğunu düşündüğüm şeyi göstermek için bir github deposu yaptım ...

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

bazı anahtar kelimeler:

  • Maven 3
  • BOM (Kendi bağımlılıklarının Bağımlılık Yönetimi)
  • Tüm Projeler için üst öğe (Dış bağımlılıklardan Bağımlılık Yönetimi ve genel Proje yapılandırması için Eklenti Yönetimi)
  • JUnit / Mockito / DBUnit
  • WEB-INF / lib olmadan Clean War projesi çünkü bağımlılıklar EAR / lib klasöründe.
  • Temiz Kulak projesi.
  • Java EE7 için minimum dağıtım tanımlayıcıları
  • @LocalBean yeterli olduğu için Yerel EJB Arayüzü yok.
  • Maven kullanıcı özellikleri aracılığıyla minimum maven yapılandırması
  • Servlet 3.1 / EJB 3.2 / JPA 2.1 için Gerçek Dağıtım Tanımlayıcıları
  • mimari kurallarını kontrol etmek için macker-maven-eklentisinin kullanımı
  • Entegrasyon Testleri etkinleştirildi, ancak atlandı. (skipITs = false) CI Derleme Sunucusunda etkinleştirmek için kullanışlıdır

Maven Çıktısı:

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
Ambalajınızı ve mimari yaklaşımınızı gerçekten beğendim. Projenizi bir maven arketipi olarak paketlemeyi düşünmelisiniz.
Jörg

2
Çok güzel çözüm! Yine de bir sorum var: BOM malzemelerini ana projeye neden paketlemiyorsunuz? neden ek katman?
sschober

1
endişelerin ayrılığının nedeni. bom başka projeler tarafından ithal edilebilir. bağımlılıklarınızın bağımlılık yönetimine ihtiyaç duyarlar, kullandığınız bağımlılıkların bağımlılık yönetimine değil. tamam. Kimse projenizi kullanmıyorsa, bu ek katman gerekli değildir diyebilirsiniz .. ama bence bu da mantıklı… okunabilirlik. üst projenin bağımlılık yönetimi bağımlılıklarınızla karıştırılmaz ... 50'den fazla dahili maven projesine sahip daha büyük bir projede, ana projenin içindeki bağımlılık yönetimi karmaşa olabilir ..
StefanHeimberg

2
başka bir neden de bunun maven.apache.org/guides/introduction/… adresinde belgelenen yapının aynısı olmasıdır . Bu, "varsayılan" belgelenmiş yol olduğu için ekip üyelerinin sık sık değiştiği bir ekipte çalışmaya yardımcı olur.
StefanHeimberg

2
BTW. Çoklu proje kurulumunun nasıl yapılabileceğini göstermek için bir kez bir GitHub projesi oluşturdum: github.com/StefanHeimberg/maven3-multiapplication-setup (şirket içi bir tartışma için)
StefanHeimberg

7

NetBeans IDE, Patrick Garner tarafından önerilene neredeyse benzeyen yapıyı otomatik olarak tanımlar. NetBeans kullanıcıları için

Dosya -> Yeni Proje -> Sol tarafta Maven'i seçin ve Sağ tarafta Maven Enterprise Uygulamasını seçin ve İleri'ye basın -> Hem savaş, hem ejb hem de ayarlar için proje adlarını sorar.

IDE, yapıyı sizin için otomatik olarak oluşturacaktır.


Size katılıyorum, özellikle JEE6 teknik özelliklerine bağlı kaldığımda
Sym-Sym

3

Bu, maven-ear-eklenti kısmına iyi bir örnektir .

Örnek olarak mevcut olan maven arketiplerini de kontrol edebilirsiniz . Sadece mvn arketipini çalıştırırsanız: oluştur, mevcut arketiplerin bir listesini alırsınız. Onlardan biri

maven-archetype-j2ee-simple

10
maven-archetype-j2ee-simpleyapısal olarak gereksiz derecede karmaşık görünüyor - özellikle modüllerin içindeki modüller ve günlük kaydı gibi şeyler için ayrı modüller. Bu yapının arkasındaki mantığı anlamadım
Vihung

2

Ben tam bir maven tabanlı kulak paketlenmiş uygulama uçtan uca örneğin yüksek ve düşük arama ve nihayet tökezledi oldum bu . Talimatlar, CLI üzerinden çalışırken 2. seçeneği seçmenizi söylüyor, ancak amaçlarınız için 1. seçeneği kullanın.


Bağlantı, yetkisiz bir hata veriyor. Bağlantılara güvenmek yerine eksiksiz çözümler yazmanın nedeni budur.
Paco Abato
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.