Maven2 : 엔터프라이즈 프로젝트 모범 사례 (EAR 파일)


100

Ant에서 Maven으로 전환 중이며 EAR 파일 기반 엔터프라이즈 프로젝트를 설정하는 모범 사례를 찾으려고합니까?

EJB 용 jar 파일, 웹 계층 용 WAR 파일 및 해당 배포 설명자와 함께 캡슐화 EAR 파일을 사용하여 꽤 표준 프로젝트를 만들고 싶다고 가정 해 보겠습니다.

어떻게해야합니까? archetypeArtifactId=maven-archetype-webappwar 파일로 프로젝트를 만들고 거기에서 확장 하시겠습니까? 이에 가장 적합한 프로젝트 구조 (및 POM 파일 예)는 무엇입니까? ear 파일 관련 배포 설명자 등을 어디에 고정합니까?

도움을 주셔서 감사합니다.

답변:


96

새 프로젝트를 만듭니다. 새 프로젝트는 EJB 프로젝트 및 WAR 프로젝트에 대한 두 가지 종속성을 포함하는 EAR 어셈블리 프로젝트입니다.

여기에 실제로 세 개의 메이븐 프로젝트가 있습니다. 하나의 EJB. 하나의 전쟁. 두 부분을 함께 당겨 귀를 만드는 하나의 EAR.

배포 설명자는 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
1 년 후 같은 질문을했을 때 제 답을 찾았습니다. 자기 잘 했어!
— 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 archetype : generate 목표를 실행하고 아키 타입 중 하나를 선택하는 것이 었는데, 그중 일부는 정기적으로 업데이트되는 것 같습니다 (특히 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

주석이 잘 달린 4 개의 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 (자체 종속성의 종속성 관리)
  • 모든 프로젝트의 상위 (외부 종속성의 종속성 관리 및 글로벌 프로젝트 구성의 경우 PluginManagement)
  • JUnit / Mockito / DBUnit
  • 종속성이 EAR / lib 폴더에 있기 때문에 WEB-INF / lib없이 Clean War 프로젝트.
  • 깨끗한 귀 프로젝트.
  • Java EE7 용 최소 배포 설명자
  • @LocalBean이 충분하므로 로컬 EJB 인터페이스가 없습니다.
  • Maven 사용자 속성을 통한 최소 Maven 구성
  • Servlet 3.1 / EJB 3.2 / JPA 2.1의 실제 배포 설명자
  • macker-maven-plugin을 사용하여 아키텍처 규칙 확인
  • 통합 테스트가 활성화되었지만 건너 뛰었습니다. (skipITs = false) CI 빌드 서버에서 활성화하는 데 유용합니다.

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
나는 당신의 패키징과 아키텍처 접근 방식을 정말 좋아합니다. 프로젝트를 메이븐 아키 타입으로 패키징하는 것을 고려해야합니다.
— Jörg

2
아주 좋은 해결책! 그래도 한 가지 질문이 있습니다. BOM 항목을 상위 프로젝트에 압축하지 않는 이유는 무엇입니까? 왜 추가 레이어입니까?
— sschober 2015

1
우려 분리의 원인. bom은 다른 프로젝트에서 가져올 수 있습니다. 사용중인 종속성의 dependencyManagement가 아니라 종속성의 dependencyManagement 만 필요합니다. 확인. 아무도 당신의 프로젝트를 사용하고 있지 않다면이 추가 레이어는 필수가 아니라고 말할 수 있습니다. 상위 프로젝트의 dependencyManagement는 종속성과 혼합되지 않습니다 ... 50 개 이상의 내부 maven 프로젝트가있는 더 큰 프로젝트에서는 상위 프로젝트 내부의 dependencyManagement가 엉망이 될 수 있습니다.
— StefanHeimberg

2
또 다른 이유는 이것이 maven.apache.org/guides/introduction/…에 문서화 된 것과 동일한 구조이기 때문 입니다. 이는 "기본"문서화 방식이기 때문에 팀 구성원이 자주 변경되는 팀에서 작업하는 데 도움이됩니다.
— StefanHeimberg 2015

2
BTW. 난 다중 프로젝트 설정을 할 수있는 방법을 보여주기 위해 한 번 GitHub의 프로젝트를 만들었습니다 github.com/StefanHeimberg/maven3-multiapplication-setup를 (회사 내부 토론)
— StefanHeimberg

7

NetBeans IDE는 Patrick Garner가 제안한 것과 거의 유사한 구조를 자동으로 정의합니다. NetBeans 사용자의 경우

파일 -> 새 프로젝트 -> 왼쪽에서 선택 메이븐을 하고 오른쪽에서 선택 메이븐 엔터프라이즈 응용 프로그램 을 누릅니다 다음 -> 전쟁, EJB 및 설정 모두를위한 프로젝트 이름을 요청합니다.

IDE가 자동으로 구조를 생성합니다.


JEE6 사양을 준수 할 때 내가 특별히 당신과 동의
— 심볼릭 Sym을

3

이것은 maven-ear-plugin 부분 의 좋은 예입니다 .

예제로 사용할 수 있는 maven archetype 을 확인할 수도 있습니다. mvn archetype : generate를 실행하면 사용 가능한 아키 타입 목록이 표시됩니다. 그들 중 하나는

maven-archetype-j2ee-simple

10
maven-archetype-j2ee-simple구조가 불필요하게 복잡해 보입니다. 특히 모듈 내부의 모듈과 로깅과 같은 것을위한 별도의 모듈이 있습니다. 나는이 구조 뒤에 이론적 이해하지 못했다
— Vihung

2

나는 완전한 maven 기반 귀 패키지 응용 프로그램의 종단 간 예제를 높고 낮게 검색하고 마침내 이것을 발견 했습니다 . 지침에는 CLI를 통해 실행할 때 옵션 2를 선택하라는 내용이 나와 있지만 용도에 따라 옵션 1을 사용하십시오.


링크에서 무단 오류가 발생합니다. 이것이 링크에 의존하는 대신 완전한 솔루션을 작성하는 이유입니다.
— Paco Abato
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.