Maven2: Praktik terbaik untuk Proyek Perusahaan (file EAR)

100

Saya baru saja beralih dari Ant ke Maven dan mencoba mencari cara terbaik untuk menyiapkan proyek Enterprise berbasis file EAR?

Katakanlah saya ingin membuat proyek yang cukup standar dengan file jar untuk EJBs, file WAR untuk tingkat Web dan file EAR enkapsulasi, dengan deskriptor penyebaran yang sesuai.

Bagaimana saya akan melakukannya? Buat proyek dengan archetypeArtifactId=maven-archetype-webappsebagai file perang, dan perluas dari sana? Apa struktur proyek terbaik (dan contoh file POM) untuk ini? Di mana Anda menempelkan deskriptor penyebaran terkait file telinga, dll?

Terima kasih atas bantuannya.

Maik
sumber

Jawaban:

96

Anda membuat proyek baru. Proyek baru adalah proyek perakitan EAR Anda yang berisi dua dependensi untuk proyek EJB dan proyek WAR Anda.

Jadi Anda sebenarnya memiliki tiga proyek ahli di sini. Satu EJB. Satu PERANG. Satu TELINGA yang menarik kedua bagian menjadi satu dan menciptakan telinga.

Deskriptor penerapan dapat dibuat oleh maven, atau ditempatkan di dalam direktori sumber daya dalam struktur proyek EAR.

Plugin maven-ear adalah yang Anda gunakan untuk mengkonfigurasinya, dan dokumentasinya bagus, tetapi tidak terlalu jelas apakah Anda masih mencari tahu cara kerja maven secara umum.

Jadi sebagai contoh Anda mungkin melakukan sesuatu seperti ini:

<?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
sumber
98
Saya menemukan jawaban saya sendiri setahun kemudian ketika saya memiliki pertanyaan yang sama. Kerja bagus!
Mike Cornell
1
Bagi saya ini berhasil ketika saya menetapkan typesebagaiejb <type>ejb</type>
gammay
Pom itu memberikan beberapa peringatan: 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-ear-plugin is missingdan 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing, jadi Anda mungkin ingin memperbarui jawaban yang bagus
DiegoAlfonso
46

Apa yang banyak membantu saya adalah menjalankan pola dasar Maven: menghasilkan tujuan dan memilih dari salah satu pola dasar, beberapa di antaranya tampaknya diperbarui secara berkala (khususnya JBoss tampaknya dipertahankan dengan baik).

mvn archetype:generate

Ratusan arketipe muncul dalam daftar bernomor untuk dipilih (519 sampai sekarang!). Sasarannya, masih berjalan, mendorong saya untuk membuat pilihan dengan memasukkan angka atau memasukkan string pencarian, misalnya:

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

Saya memasukkan string pencarian "ear", yang mengurangi daftar menjadi hanya 8 item (hingga hari ini):

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

Saya memilih "org.jboss.spec.archetypes: jboss-javaee6-ear-webapp" (dengan memasukkan pilihan "5" dalam contoh ini).

Selanjutnya, tujuan meminta saya untuk memasukkan groupId, artifactId, nama paket, dll., Dan kemudian menghasilkan aplikasi contoh yang terdokumentasi dengan baik berikut:

[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

Setelah membaca empat file POM, yang memiliki banyak komentar, saya mendapatkan hampir semua informasi yang saya butuhkan.

./pom.xml
./Foo-ear/pom.xml
./Foo-ejb/pom.xml
./Foo-web/pom.xml
Patrick Garner
sumber
3
Ini berfungsi, tetapi pada akhirnya menempatkan sekumpulan dependensi khusus jboss ke dalam proyek Anda, yang mungkin ingin atau tidak ingin Anda bersihkan setelah kejadian tersebut.
Ian McLaird
24

saya telah membuat repositori github untuk menunjukkan apa yang menurut saya merupakan struktur proyek startup yang baik (atau praktik terbaik) ...

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

beberapa kata kunci:

  • Maven 3
  • BOM (DependencyManagement dari dependensi sendiri)
  • Induk untuk semua Proyek (DependencyManagement dari dependensi eksternal dan PluginManagement untuk konfigurasi Proyek global)
  • JUnit / Mockito / DBUnit
  • Proyek Clean War tanpa WEB-INF / lib karena dependensinya ada di folder EAR / lib.
  • Proyek Clean Ear.
  • Deskriptor penerapan minimal untuk Java EE7
  • Tidak Ada Antarmuka EJB Lokal karena @LocalBean sudah cukup.
  • Konfigurasi maven minimal melalui properti pengguna maven
  • Deskriptor Penerapan Aktual untuk Servlet 3.1 / EJB 3.2 / JPA 2.1
  • penggunaan macker-maven-plugin untuk memeriksa aturan arsitektur
  • Tes Integrasi diaktifkan, tetapi dilewati. (skipITs = false) berguna untuk diaktifkan di CI Build Server

Keluaran Maven:

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
sumber
2
Saya sangat menyukai pendekatan pengemasan dan arsitektur Anda. Anda harus memikirkan tentang mengemas proyek Anda sebagai arketipe ahli.
Jörg
2
Solusi yang sangat bagus! Saya punya satu pertanyaan: mengapa tidak mengemas barang-barang BOM ke dalam proyek induk? mengapa lapisan tambahan?
sschober
1
penyebab pemisahan perhatian. bom itu bisa diimpor oleh proyek lain. mereka hanya membutuhkan dependencyManagement dari dependensi Anda dan bukan dependencyManagement dari dependensi yang Anda gunakan. baik. Anda dapat mengatakan bahwa jika tidak ada yang menggunakan proyek Anda, lapisan tambahan ini tidak diperlukan .. tetapi menurut saya itu masuk akal juga ... keterbacaan. the dependencyManagement dari proyek induk tidak dicampur dengan dependensi Anda ... dalam proyek yang lebih besar dengan> 50 proyek maven internal, dependencyManagement di dalam proyek induk bisa menjadi berantakan ..
StefanHeimberg
2
alasan lainnya adalah bahwa ini adalah struktur yang sama seperti yang didokumentasikan di maven.apache.org/guides/introduction/… . ini membantu untuk bekerja dalam tim di mana anggota tim sering berubah karena itu adalah cara terdokumentasi "default".
StefanHeimberg
2
BTW. saya telah membuat proyek GitHub sekali untuk menunjukkan bagaimana pengaturan multi proyek dapat dilakukan: github.com/StefanHeimberg/maven3-multiapplication-setup (untuk diskusi internal perusahaan)
StefanHeimberg
7

NetBeans IDE secara otomatis mendefinisikan struktur yang hampir mirip dengan yang disarankan oleh Patrick Garner. Untuk pengguna NetBeans

File -> Proyek Baru -> Di sisi kiri pilih Maven dan Di sisi kanan pilih Aplikasi Perusahaan Maven dan tekan Berikutnya -> Minta nama proyek untuk perang, ejb dan pengaturan.

IDE akan secara otomatis membuat struktur untuk Anda.

stackOverflow
sumber
Saya setuju dengan Anda, khususnya jika mengikuti spesifikasi JEE6
Sym-Sym
3

Ini adalah contoh bagus dari bagian maven-ear-plugin .

Anda juga dapat memeriksa arketipe maven yang tersedia sebagai contoh. Jika Anda baru saja menjalankan arketipe mvn: menghasilkan Anda akan mendapatkan daftar arketipe yang tersedia. Salah satunya adalah

maven-archetype-j2ee-simple
hcpl
sumber
10
maven-archetype-j2ee-simpletampaknya tidak perlu rumit dalam struktur - terutama dengan modul di dalam modul, dan modul terpisah untuk hal-hal seperti logging. Saya tidak mengerti alasan di balik struktur ini
Vihung
2

Saya telah mencari tinggi dan rendah untuk contoh ujung-ke-ujung dari aplikasi paket telinga lengkap berbasis maven dan akhirnya menemukan ini . Instruksi mengatakan untuk memilih opsi 2 saat menjalankan melalui CLI tetapi untuk tujuan Anda, gunakan opsi 1.

Roy Truelove
sumber
Tautan memunculkan kesalahan yang tidak sah. Dan itulah alasan untuk menulis solusi lengkap daripada mengandalkan tautan.
Paco Abato