Maven2: แนวทางปฏิบัติที่ดีที่สุดสำหรับโครงการระดับองค์กร (ไฟล์ EAR)


100

ฉันเพิ่งเปลี่ยนจาก Ant เป็น Maven และกำลังพยายามหาแนวทางปฏิบัติที่ดีที่สุดในการตั้งค่าโครงการ Enterprise ที่ใช้ไฟล์ EAR หรือไม่

สมมติว่าฉันต้องการสร้างโปรเจ็กต์มาตรฐานสวย ๆ ด้วยไฟล์ jar สำหรับ EJB ไฟล์ WAR สำหรับ Web tier และไฟล์ EAR ที่ห่อหุ้มด้วยตัวบอกการปรับใช้ที่เกี่ยวข้อง

ฉันจะไปได้อย่างไร สร้างโปรเจ็กต์ด้วยarchetypeArtifactId=maven-archetype-webappไฟล์ war และขยายจากที่นั่น? โครงสร้างโครงการที่ดีที่สุดคืออะไร (และตัวอย่างไฟล์ POM) สำหรับสิ่งนี้ คุณติดเอียร์ไฟล์ตัวบอกการปรับใช้ที่เกี่ยวข้องกับไฟล์เอียร์ที่ไหน ฯลฯ

ขอบคุณสำหรับความช่วยเหลือ

คำตอบ:


96

คุณสร้างโครงการใหม่ โครงการใหม่คือโครงการประกอบ EAR ของคุณซึ่งมีการอ้างอิงสองรายการสำหรับโครงการ EJB และโครงการ WAR ของคุณ

คุณมีโครงการ maven สามโครงการที่นี่ หนึ่ง EJB สงครามหนึ่งครั้ง หูเดียวที่ดึงทั้งสองส่วนเข้าด้วยกันและสร้างหู

ตัวบอกการปรับใช้สามารถสร้างโดย maven หรือวางไว้ในไดเร็กทอรีรีซอร์สในโครงสร้างโปรเจ็กต์ EAR

maven-ear-plugin คือสิ่งที่คุณใช้ในการกำหนดค่าและเอกสารประกอบนั้นดี แต่ยังไม่ชัดเจนนักหากคุณยังคงคิดว่า maven ทำงานโดยทั่วไปอย่างไร

ตัวอย่างเช่นคุณอาจทำสิ่งนี้:

<?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
ฉันพบคำตอบของตัวเองในอีกหนึ่งปีต่อมาเมื่อฉันมีคำถามเดียวกัน งานดีเอง!
Mike Cornell

1
สำหรับฉันสิ่งนี้ใช้ได้ผลเมื่อฉันตั้งtypeเป็นejb <type>ejb</type>
gammay

ปอมนั้นมีคำเตือนบางอย่าง'build.plugins.plugin.version' for org.apache.maven.plugins:maven-ear-plugin is missingและ'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missingดังนั้นคุณอาจต้องการอัปเดตคำตอบที่ยอดเยี่ยมของคุณ
DiegoAlfonso

46

สิ่งที่ช่วยฉันได้มากคือการเรียกใช้แม่แบบ Maven: สร้างเป้าหมายและเลือกจากหนึ่งในต้นแบบซึ่งบางอย่างดูเหมือนจะได้รับการอัปเดตเป็นประจำ (โดยเฉพาะ JBoss ดูเหมือนจะได้รับการดูแลอย่างดี)

mvn archetype:generate

ต้นแบบหลายร้อยแบบปรากฏในรายการลำดับเลขที่ให้เลือก (519 ณ ตอนนี้!) เป้าหมายยังคงทำงานอยู่แจ้งให้ฉันทำการเลือกโดยป้อนตัวเลขหรือป้อนสตริงค้นหาเช่น:

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

ฉันป้อนสตริงค้นหา "ear" ซึ่งลดรายการเหลือเพียง 8 รายการ (ณ วันนี้):

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" (โดยป้อนตัวเลือก "5" ในตัวอย่างนี้)

จากนั้นเป้าหมายขอให้ฉันป้อน groupId, artifactId, ชื่อแพ็กเกจ ฯลฯ จากนั้นสร้างแอปพลิเคชันตัวอย่างที่มีเอกสารอย่างดีดังต่อไปนี้:

[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

หลังจากอ่านไฟล์ POM ทั้งสี่ไฟล์ซึ่งได้รับความคิดเห็นเป็นอย่างดีฉันมีข้อมูลทั้งหมดที่ต้องการ

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

3
วิธีนี้ใช้งานได้ แต่จะลงเอยด้วยการใส่การอ้างอิงเฉพาะ jboss ลงในโปรเจ็กต์ของคุณซึ่งคุณอาจหรือไม่ต้องการทำความสะอาดหลังจากข้อเท็จจริง
Ian McLaird

24

ฉันได้สร้างที่เก็บ github เพื่อแสดงสิ่งที่ฉันคิดว่าเป็นโครงสร้างโครงการเริ่มต้นที่ดี (หรือแนวทางปฏิบัติที่ดีที่สุด) ...

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

คำหลักบางคำ:

  • มาเวน 3
  • BOM (DependencyManagement การอ้างอิงของตนเอง)
  • พาเรนต์สำหรับโปรเจ็กต์ทั้งหมด (DependencyManagement จากการอ้างอิงภายนอกและ PluginManagement สำหรับคอนฟิกูเรชันโปรเจ็กต์ส่วนกลาง)
  • JUnit / Mockito / DBUnit
  • โปรเจ็กต์ Clean War ที่ไม่มี WEB-INF / lib เนื่องจากการอ้างอิงอยู่ในโฟลเดอร์ EAR / lib
  • โครงการ Clean Ear
  • ตัวบอกการปรับใช้ขั้นต่ำสำหรับ Java EE7
  • ไม่มีอินเทอร์เฟซ EJB ภายในเนื่องจาก @LocalBean เพียงพอ
  • การกำหนดค่า maven น้อยที่สุดผ่านคุณสมบัติผู้ใช้ maven
  • ตัวบอกการปรับใช้จริงสำหรับ Servlet 3.1 / EJB 3.2 / JPA 2.1
  • การใช้ macker-maven-plugin เพื่อตรวจสอบกฎสถาปัตยกรรม
  • เปิดใช้งานการทดสอบการรวม แต่ข้ามไป (skipITs = false) มีประโยชน์ในการเปิดใช้งานบน CI Build Server

เอาท์พุท 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
------------------------------------------------------------------------

2
ฉันชอบบรรจุภัณฑ์และแนวทางสถาปัตยกรรมของคุณมาก คุณควรคิดเกี่ยวกับการบรรจุโครงการของคุณเป็นแม่แบบ maven
Jörg

2
ทางออกที่ดีมาก! ฉันมีคำถามหนึ่งข้อ: ทำไมไม่รวม BOM ไว้ในโครงการหลัก ทำไมต้องเป็นเลเยอร์เพิ่มเติม
sschober

1
สาเหตุของการแยกความกังวล Bom สามารถนำเข้าโดยโครงการอื่น ๆ พวกเขาต้องการเพียงการจัดการการพึ่งพาของคุณและไม่ใช่การจัดการการพึ่งพาที่คุณใช้ ตกลง. คุณสามารถพูดได้ว่าถ้าไม่มีใครใช้โปรเจ็กต์ของคุณเลเยอร์เพิ่มเติมนี้ก็ไม่ใช่เนสสิคารี .. แต่ฉันคิดว่ามันก็สมเหตุสมผลเช่นกัน ... การพึ่งพาการจัดการของโปรเจ็กต์พาเรนต์จะไม่ผสมกับการพึ่งพาของคุณ ... ในโปรเจ็กต์ที่ใหญ่กว่าที่มี maven ภายใน> 50 โปรเจ็กต์การจัดการการพึ่งพาภายในโปรเจ็กต์พาเรนต์อาจจะวุ่นวาย ..
StefanHeimberg

2
อีกเหตุผลหนึ่งคือว่าเป็นรูปแบบเดียวกันกับเอกสารที่maven.apache.org/guides/introduction/... ซึ่งจะช่วยในการทำงานในทีมที่สมาชิกในทีมมักจะเปลี่ยนไปเนื่องจากเป็นวิธีการจัดทำเอกสาร "ค่าเริ่มต้น"
StefanHeimberg

2
BTW. ฉันได้สร้างโครงการ GitHub หนึ่งครั้งเพื่อแสดงให้เห็นว่าการตั้งค่าหลายโครงการทำได้อย่างไร: github.com/StefanHeimberg/maven3-multiapplication-setup (สำหรับการสนทนาภายใน บริษัท )
StefanHeimberg

7

NetBeans IDE กำหนดโครงสร้างโดยอัตโนมัติซึ่งเกือบจะคล้ายกับที่ Patrick Garner แนะนำ สำหรับผู้ใช้ NetBeans

File -> New Project -> ทางด้านซ้ายเลือกMavenและ In ด้านขวาเลือกMaven Enterprise Applicationแล้วกดNext -> ถามชื่อโปรเจ็กต์สำหรับทั้ง war, ejb และ settings

IDE จะสร้างโครงสร้างให้คุณโดยอัตโนมัติ


ฉันเห็นด้วยกับคุณเป็นพิเศษเมื่อปฏิบัติตามข้อกำหนด JEE6
Sym-Sym

3

นี่คือตัวอย่างที่ดีของ Maven หูปลั๊กอินส่วนหนึ่ง

คุณยังสามารถตรวจสอบรูปแบบ mavenที่มีให้เป็นตัวอย่าง หากคุณแค่รันต้นแบบ mvn: สร้างคุณจะได้รับรายชื่อของต้นแบบที่มีอยู่ หนึ่งในนั้นคือ

maven-archetype-j2ee-simple

10
maven-archetype-j2ee-simpleดูเหมือนมีโครงสร้างที่ซับซ้อนโดยไม่จำเป็นโดยเฉพาะอย่างยิ่งกับโมดูลภายในโมดูลและโมดูลแยกต่างหากสำหรับสิ่งต่างๆเช่นการบันทึก ฉันไม่เข้าใจเหตุผลเบื้องหลังโครงสร้างนี้
Vihung

2

ฉันได้รับการค้นหาสูงและต่ำสำหรับตัวอย่างแบบ end-to-end ของใบสมัครที่สมบูรณ์ Maven ตามหูบรรจุและในที่สุดก็เจอนี้ คำแนะนำบอกว่าให้เลือกตัวเลือก 2 เมื่อเรียกใช้ผ่าน CLI แต่สำหรับวัตถุประสงค์ของคุณให้ใช้ตัวเลือก 1


ลิงก์แสดงข้อผิดพลาดที่ไม่ได้รับอนุญาต และนั่นคือเหตุผลในการเขียนโซลูชันที่สมบูรณ์แทนที่จะใช้ลิงก์
Paco Abato
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.