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.