Maven2: Phương pháp hay nhất cho Dự án Doanh nghiệp (tệp EAR)


100

Tôi vừa chuyển từ Ant sang Maven và đang cố gắng tìm ra phương pháp hay nhất để thiết lập dự án Doanh nghiệp dựa trên tệp EAR?

Giả sử tôi muốn tạo một dự án khá chuẩn với tệp jar cho EJB, tệp WAR cho tầng Web và tệp EAR đóng gói, với các bộ mô tả triển khai tương ứng.

Làm thế nào tôi sẽ đi về nó? Tạo dự án vớiarchetypeArtifactId=maven-archetype-webapp như với tệp chiến tranh và mở rộng từ đó? Cấu trúc dự án tốt nhất (và ví dụ về tệp POM) cho điều này là gì? Bạn dán các bộ mô tả triển khai liên quan đến tệp tai, v.v. ở đâu?

Cảm ơn vì bất kì sự giúp đỡ.

Câu trả lời:


95

Bạn tạo một dự án mới. Dự án mới là dự án lắp ráp EAR của bạn trong đó có hai phần phụ thuộc của bạn cho dự án EJB và dự án WAR của bạn.

Vì vậy, bạn thực sự có ba dự án maven ở đây. Một EJB. MỘT CHIẾN TRANH. Một TAI để kéo hai phần lại với nhau và tạo ra tai.

Bộ mô tả triển khai có thể được tạo bởi maven, hoặc được đặt bên trong thư mục tài nguyên trong cấu trúc dự án EAR.

Maven-ear-plugin là thứ bạn sử dụng để định cấu hình nó và tài liệu hướng dẫn khá tốt, nhưng không hoàn toàn rõ ràng nếu bạn vẫn đang tìm hiểu cách hoạt động của maven nói chung.

Vì vậy, như một ví dụ, bạn có thể làm điều gì đó như sau:

<?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
Tôi đã tìm ra câu trả lời cho riêng mình một năm sau đó khi tôi có cùng một câu hỏi. Làm tốt bản thân!
Mike Cornell,

1
Đối với tôi, điều này đã hoạt động khi tôi đặt typeejb <type>ejb</type>
gammay

Pom đó ném một số cảnh báo: '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, vì vậy bạn có thể muốn cập nhật câu trả lời khác tuyệt vời của bạn
DiegoAlfonso

46

Điều đã giúp tôi rất nhiều là chạy nguyên mẫu Maven: tạo mục tiêu và chọn từ một trong các nguyên mẫu, một số trong số đó dường như được cập nhật thường xuyên (đặc biệt là JBoss dường như được duy trì tốt).

mvn archetype:generate

Hàng trăm nguyên mẫu xuất hiện trong một danh sách được đánh số để lựa chọn (tính đến nay là 519!). Mục tiêu, vẫn đang chạy, đã nhắc tôi thực hiện lựa chọn bằng cách nhập một số hoặc nhập chuỗi tìm kiếm, ví dụ:

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

Tôi đã nhập chuỗi tìm kiếm "tai", làm giảm danh sách xuống chỉ còn 8 mục (tính đến hôm nay):

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

Tôi đã chọn "org.jboss.spec.archetypes: jboss-javaee6-ear-webapp" (bằng cách nhập lựa chọn "5" trong ví dụ này).

Tiếp theo, mục tiêu yêu cầu tôi nhập groupId, tạo tác, tên gói, v.v. và sau đó nó tạo ứng dụng ví dụ được ghi chép đầy đủ sau:

[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

Sau khi đọc bốn tệp POM, được nhận xét tốt, tôi đã có khá nhiều thông tin cần thiết.

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

3
Điều này hoạt động, nhưng cuối cùng nó sẽ đưa một loạt các phụ thuộc cụ thể vào jboss vào dự án của bạn, mà bạn có thể muốn hoặc không muốn dọn dẹp sau khi thực tế.
Ian McLaird

24

tôi đã tạo một kho lưu trữ github để hiển thị những gì tôi nghĩ là cấu trúc dự án khởi nghiệp tốt (hoặc các phương pháp hay nhất) ...

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

một số từ khóa:

  • Maven 3
  • BOM (Sự phụ thuộc Quản lý các phần phụ thuộc riêng)
  • Gốc cho tất cả các Dự án (Quản lý phụ thuộc từ các phụ thuộc bên ngoài và Quản lý Plugin cho cấu hình Dự án toàn cầu)
  • JUnit / Mockito / DBUnit
  • Dự án Clean War không có WEB-INF / lib vì các phần phụ thuộc nằm trong thư mục EAR / lib.
  • Dự án Clean Ear.
  • Bộ mô tả triển khai tối thiểu cho Java EE7
  • Không có giao diện EJB cục bộ vì @LocalBean là đủ.
  • Cấu hình maven tối thiểu thông qua thuộc tính người dùng maven
  • Các bộ mô tả triển khai thực tế cho Servlet 3.1 / EJB 3.2 / JPA 2.1
  • sử dụng macker-maven-plugin để kiểm tra các quy tắc kiến ​​trúc
  • Đã bật Kiểm tra tích hợp nhưng bị bỏ qua. (Bỏ quaITs = false) hữu ích để bật trên Máy chủ xây dựng CI

Đầu ra 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
Tôi thực sự thích cách tiếp cận bao bì và kiến ​​trúc của bạn. Bạn nên nghĩ đến việc đóng gói dự án của mình dưới dạng nguyên mẫu maven.
Jörg

2
Giải pháp rất hay! Tôi có một câu hỏi mặc dù: tại sao không đóng gói nội dung BOM vào dự án mẹ? tại sao lại là lớp bổ sung?
sschober

1
nguyên nhân của sự phân tách các mối quan tâm. bom có ​​thể được nhập khẩu bởi các dự án khác. họ chỉ cần sự quản lý của các phụ thuộc của bạn chứ không cần sự quản lý của các phụ thuộc mà bạn đang sử dụng. đồng ý. bạn có thể nói rằng nếu không ai đang sử dụng dự án của bạn thì lớp bổ sung này không phải là cần thiết .. nhưng tôi nghĩ rằng nó cũng có ý nghĩa ... khả năng đọc. các dependencyManagement của dự án cha mẹ không được trộn với phụ thuộc của bạn ... trong một dự án lớn hơn với> 50 dự án maven nội bộ dependencyManagement bên trong dự án cha mẹ có thể là một mớ hỗn độn ..
StefanHeimberg

2
một lý do khác là đây là cấu trúc giống như được ghi lại tại maven.apache.org/guides/introduction/… . điều này giúp làm việc trong một nhóm mà các thành viên trong nhóm thường xuyên thay đổi vì đó là cách được ghi nhận "mặc định".
StefanHeimberg

2
BTW. tôi đã tạo ra một dự án GitHub một lần để hiển thị như thế nào một thiết lập đa dự án có thể được thực hiện: github.com/StefanHeimberg/maven3-multiapplication-setup (cho một cuộc thảo luận nội bộ công ty)
StefanHeimberg

7

NetBeans IDE tự động xác định cấu trúc gần giống với cấu trúc do Patrick Garner đề xuất. Đối với người dùng NetBeans

File -> New Project -> Ở bên trái chọn Maven và Ở bên phải chọn Maven Enterprise Application và nhấn Next -> Hỏi tên dự án cho cả war, ejb và settings.

IDE sẽ tự động tạo cấu trúc cho bạn.


Tôi đồng ý với bạn, đặc biệt khi tôn trọng những chi tiết kỹ thuật JEE6
Sym-Sym

3

Đây là một ví dụ điển hình về phần maven-ear-plugin .

Bạn cũng có thể kiểm tra các nguyên mẫu maven có sẵn làm ví dụ. Nếu bạn chỉ chạy archetype mvn: create, bạn sẽ nhận được một danh sách các kiểu mẫu có sẵn. Một trong số đó là

maven-archetype-j2ee-simple

10
maven-archetype-j2ee-simplecó vẻ phức tạp không cần thiết về cấu trúc - đặc biệt là với các mô-đun bên trong các mô-đun và các mô-đun riêng biệt cho những thứ như ghi nhật ký. Tôi không hiểu lý do đằng sau cấu trúc này
Vihung

3

Tôi đã tìm kiếm từ đầu đến cuối cho một ví dụ đầu cuối về một ứng dụng đóng gói hoàn chỉnh dựa trên tai nghe maven và cuối cùng tình cờ nhận ra điều này . Các hướng dẫn nói để chọn tùy chọn 2 khi chạy qua CLI nhưng cho mục đích của bạn, hãy sử dụng tùy chọn 1.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.